首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++ 波澜壮阔 40 年:一览C++三大核心要点 I/O流、缺省参数、函数重载

C++ 波澜壮阔 40 年:一览C++三大核心要点 I/O流、缺省参数、函数重载

作者头像
晨非辰Tong
发布2025-12-23 15:01:05
发布2025-12-23 15:01:05
320
举报
文章被收录于专栏:C++C++

引言

  完成C语言学习后,我们正式进入C++世界。C++在保留C语言优势的同时,引入了更现代化的特性,让代码更简洁、安全。   本文将重点解析C++三大核心特性:输入输出流、缺省参数、函数重载。从cin/cout的智能类型识别,我们将逐一剖析其原理与应用。   无论您是C++初学者,还是希望巩固基础的开发者,本文都将为您提供清晰的学习路径,助您打好C++编程基础。

一、梦的出发点:C++输入&&输出

1.1 一览:入门C++要知道的

  1. 核心组件 < iostream >标准库(一个头文件),是Input Out Stream的缩写,它是标准的输入、输出流库,定义标准的输入、输出对象,构成了C++标准I/O流库的基础框架。
  2. 标准流对象解析
  • 输入流机制: std::cinistream类的对象,主要面向窄字符(char类型)的标准输入操作,建立了从部设备(键盘)到程序内部的数据通道。
  • 输出流机制: std::coutostream类的对象,主要面向窄字符的标准输出流,负责向标准输出设备(显示器)传输窄字符。
  1. 部分基础元素
  • 换行 / 缓冲区控制: std::endl,是一个函数,流插入输出时,相当于插入一个换行符+刷新缓冲区。
  • 运算符多重角色扮演: <<是流输入运算符,>>是流提取运算符。(在C语言中分别扮演了位运算左移、位运算右移的角色)。

提示: I / O流涉及类和对象、运算符重载、继承等很多面向对象的知识,由于是刚刚开始接触C++的学习,就先简单认识了I/O流的用法,后面会专门学习。

1.2 “进军”C++:与C语言相异所在

  • 使用C++的输入输出更方便,不需要像C语言的printf/scanf输入输出时要自己设定格式。C++的输入输出能够自动识别变量的类型(本质为函数重载)。最重要的是C++的流更好的支持自定义类型对象的输入输出
  • cout / cin / endl等都属于C++的标准库,标准库放在std的命名空间中,要通过命名空间的使用方式去调用。
代码语言:javascript
复制
#include <iostream>
using namespace std;//日常联系可以

int main()
{
	int a = 0;
	double b = 0.1;

	//输入
	// 任何变量,都转换成字符串,插入到流中
	cin >> a >> b;//自动识别类型

	//输出
	cout << a << '\n';//换行除endl也可以是'\n',"\n"
	cout << a << b << endl;
	return 0;
}
在这里插入图片描述
在这里插入图片描述

注意: 推荐换行使用'\n',这样有助于提升效率,而在最后一次的输出语句是使用endl

  • 没有包含<stdio.h>头文件,但是也可以用printf / scanf,因为被间接包含在了<iostream>中。(在VS编译器中是这样的,使用别的编译器可能报错!)

  通过简单的程序观察是否不用包含<stdio.h>

代码语言:javascript
复制
#include <iostream>

int main()
{
	int a = 0;
	printf("请输入:");
	scanf("%d", &a);
	printf("a = %d\n", a);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

显然是它是对的!!

  • 额外补充:(打比赛会遇见)
代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
	//在io需求比较高的地方,如部分大量输入的竞赛题中,加上以下3行代码
	//提高C++IO效率
	//取消了同步流
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	return 0;
}

二、缺省参数:函数效率“杀手”

  缺省参数又称默认参数,是声明/定义函数时将函数的参数设定为默认值。调用函数如果没有指定实参,就是用默认值,反之使用实参。缺省参数分为全缺省、半缺省参数。

2.1一览:关键要点全知道

  • 全缺省参数:函数参数全部不指定实参,形参使用缺省值;半缺省参数:函数指定部分实参,其余使用缺省参数。
  • C++规定,半缺省参数必须从右往左依次连续缺省,不能间隔给缺省值。
  • C++:调用带缺省参数的函数,必须从左往右依次给实参,不能间隔指定。
  • 函数的声明、定义分离时,规定缺省参数只能在函数声明给出。
  1. 演示全缺省:
代码语言:javascript
复制
//全缺省
#include <iostream>
using namespace std;

void func1(int a = 10, int b = 20, int c = 30)
{
	cout << "a= " << a << '\n';
	cout << "b= " << b << '\n';
	cout << "c= " << c << endl;

}

int main()
{
	func1();
	return 0;
}
在这里插入图片描述
在这里插入图片描述
  1. 演示半缺省:

(缺省参数必须从右往左连续缺省,传参必须从左往右连续传参,不能跳跃!)

  • 正确使用
代码语言:javascript
复制
//半缺省
#include <iostream>
using namespace std;

void func1(int a = 10, int b = 20, int c = 30)
{
	cout << "a= " << a << '\n';
	cout << "b= " << b << '\n';
	cout << "c= " << c << endl;

}

int main()
{
	func1(1, 2);
	return 0;
}
  • 错误使用
代码语言:javascript
复制
#include <iostream>
using namespace std

//缺省参数设置正确
void func1(int a = 100, int b = 210, int c = 310)
{
	cout << "a= " << a << '\n';
	cout << "b= " << b << '\n';
	cout << "c= " << c << endl;

}

int main()
{
	//传实参错误:跳跃
	//func1(1, ,2);
	return 0;
}

在传参时,如果想让第二个参数 b 为缺省参数,因为不能跳跃传参,那么可以调换缺省参数的顺序:

代码语言:javascript
复制
#include <iostream>
using namespace std

void func1(int a = 100, int c = 310, int b = 210)
{
	cout << "a= " << a << '\n';
	cout << "b= " << b << '\n';
	cout << "c= " << c << endl;
}

int main()
{
	
	func1(1, 2);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

当然,缺省参数的使用在前面学习的数据结构中同样有作用


三、 函数重载:一名多能的“艺术”

  函数重载:C++允许在同一个作用域中定义同名函数,但是要求参数不同(个数不同/类型不同)。

3.1一览:“艺术”的三种形式

  1. 参数个数不同:
代码语言:javascript
复制
#include <iostream>
using namespace std;

void func()
{
	cout <<' ' << endl;
}

void func(int a)
{

	cout << "a=" << a << endl;
}

int main()
{
	func();

	func(10);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

这里要注意:对于个数不同的,最好不要使用缺省参数!! 会导致调用歧义,编译器不知道调用哪个函数。

  • 错误用例:
代码语言:javascript
复制
#include <iostream>
using namespace std;

void func1()
{
	cout <<' ' << endl;
}

void func1(int a = 10)
{

	cout << "a=" << a << endl;
}

int main()
{
	//func();

	/?func(10);
	return 0;
}
在这里插入图片描述
在这里插入图片描述
  1. 参数类型不同:
代码语言:javascript
复制
#include <iostream>
using namespace std;

int Add(int a, int b)
{
	return a + b;
}

double Add(double a, double b)
{
	return a + b;
}
int main()
{
	cout << "Add(a, b) = " << Add(10, 20) << '\n';
	cout << "Add(a, b) = " << Add(10.1, 20.2) << endl;
	return 0;
}
在这里插入图片描述
在这里插入图片描述
  1. 参数顺序不同:
代码语言:javascript
复制
#include <iostream>
using namespace std;

void func1(double a, int b)
{
	cout << "f1(double a,int b)" << '\n';
}

void func1(int a, double b)
{
	cout << "f1(int a,double b)" << '\n';
}

int main()
{
	//编译器会根据传参的顺序来调用对应函数
	func1(2.3, 1);
	func1(1, 2.3);
	

	return 0;
}
在这里插入图片描述
在这里插入图片描述
  • 错误用例:
代码语言:javascript
复制
#include<iostream>
using namespace std;

void func2()
{

}

int func2()
{
	return 1;
}

int main()
{
	//调用时无法确定调用那个
	func2();
	int x = func2();
	return 0;
}
在这里插入图片描述
在这里插入图片描述

返回条件不同不能构成函数重载,调用歧义



总结

代码语言:javascript
复制
🍓 我是晨非辰Tong!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:

  C++的基础特性为我们打开了现代化编程的大门:I/O流以更自然的方式处理输入输出,缺省参数让函数调用更加灵活,函数重载通过参数差异实现接口统一。   掌握这些核心概念,不仅是理解C++设计哲学的关键,更是后续探索面向对象、模板元编程等高级特性的坚实基础。从C到C++的升级,正是从“如何实现”到“如何优雅高效地实现”的思维跃迁。

源码参考:https://gitee.com/tian-aochen/c-learning-record/tree/master/test_11.21_C++%E5%85%A5%E9%97%A8/Basics

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 一、梦的出发点:C++输入&&输出
    • 1.1 一览:入门C++要知道的
    • 1.2 “进军”C++:与C语言相异所在
  • 二、缺省参数:函数效率“杀手”
    • 2.1一览:关键要点全知道
  • 三、 函数重载:一名多能的“艺术”
    • 3.1一览:“艺术”的三种形式
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档