☰
看完少踩 80% 的坑:C++ 输入输出、缺省参数、函数重载,一次讲透还不秃头
2026/10/1 17:13:58 网站建设 项目流程

何时秋风初拂面?已觉寒气暗侵衣。

一叶梧桐惊岁晚,满庭风雨送夏归。

1.C++的输入和输出

使用C++的输入和输出需要包含头文件#include<iostream>

cin 与 cout 位于 std 命名空间内,使用时需要通过 std:: 限定,或是通过 using 引入命名空间

C++ 的输入输出是基于流对象实现的,核心为标准输入流 cin 与标准输出流 cout,二者定义在 std 命名空间中,是对控制台输入输出的面向对象封装。

cin 负责从键盘读取数据,cout 负责向控制台输出内容,还有 cerr 专门用来输出错误信息。

相较于 C 语言的 scanf 和 printf,cin 与 cout 依靠运算符重载自动识别变量类型,不需要手动书写格式控制符,使用提取运算符 >> 完成输入,使用插入运算符 << 完成输出。

Ⅰ.std::cout(此处c是将其他类型转换为char),是ostream类的对象,主要面向窄字符的标准输出流,自动指定类型,cout 输出内容时不会自动换行,需要手动添加换行符号

cout相比于printf:

①.printf需要指定格式,原生定义类型,其他类型无法支持

②.cout/cin可以输入或者输出任意类型

③.cout效率没有printf高,大量输出时需要改进:

#include <iostream> using namespace std; int main() { ios_base::sync_with_stdio(false);//用来关闭 C++ 标准流和 C 标准流的同步,通常可以加快 cin / cout 的输入输出速度。 //ios_base::sync_with_stdio(false); 也可以写成 ios::sync_with_stdio(false);,两者都可以。 cin.tie(nullptr);//cin.tie(nullptr) 取消 cin 与 cout 的绑定,减少不必要的刷新 cout.tie(nullptr); return 0; }

Ⅱ.std::endl是操纵符,底层实现是一个函数,流插入输出时,相当于插入一个换行字符+刷新缓冲区(end line)换行

频繁使用 endl 会反复刷新缓冲区,造成性能下降,大量输出场景优先选择 '\n' 代替 endl

Ⅲ.<<是流插入运算符,>>是流提取运算符,(C语言还用这两个运算符做位运算左移/右移)

Ⅳ.std::cin是istream类的对象,面向窄字符(narrow characters (of type char)),是标准输入流。cin 默认将空格、换行符、制表符视作分隔符,读取数据时会自动跳过空白字符

std::cin>>i>>d//先输入i再输入d

cin 读取字符串时,遇到空格就会停止读取,如果需要读取包含空格的整行文本,应当选用 getline,不能直接使用 cin 读取字符串。

cin 读取完成后,输入缓冲区会残留换行符,干扰后续 getline 读取,需要手动清理缓冲区

cin 读取失败时,流对象会进入错误状态,后续所有输入操作都会失效,需要检测并重置流状态

Ⅴ.cerr 输出的错误信息不经过缓冲区缓存,会直接打印,适合输出程序的报错信息

2.缺省参数(默认值):

是声明或定义函数时,为函数指定的一个缺省值,在调用该函数时,若没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省

Ⅰ.全缺省:用到全部形参缺省值

#include <iostream> using namespace std; void f(int a = 10, int b = 20, int c = 30) { cout << "a=" << a << endl; cout << "b=" << b << endl; cout << "c=" << c << endl; }

情景一:

f():a=10,b=20,c=30

情景二:

f(1):a = 1,b = 20,c = 30

情景三:

f(1,2):a = 1,b = 2,c = 30

情景四:

f(1,2,3):a = 1, b = 5,c = 3

Ⅱ.半缺省:部分形参给缺省值(C++中参数从右向左依次连续缺省)

#include <iostream> using namespace std; void f(int a , int b = 20, int c = 30) { cout << "a=" << a << endl; cout << "b=" << b << endl; cout << "c=" << c << endl; }

Ⅲ.带缺省参数的函数调用(C++从左往右依次给实参)

Ⅳ.函数定义和声明分离时,缺省参数不能再函数声明和定义中同时出现,规定必须函数声明给出缺省值

如果定义在声明之后,定义中只能出现声明中未指定默认值的参数

如:声明:void print(int a = 10,int b,int c)

定义:void print(int a,int b = 20,int c = 30)

声明时只给了部分默认值,定义时可以给出剩下未给出的默认值

//声明里设定缺省值 int Add(int a = 1, int b = 2); //全缺省函数 int Add(int a, int b) { int c = a + b; return c; }

注意:缺省值可以是常量或者全局变量,但不能使用局部变量作为缺省参数的值。

缺省参数的优点:

缺省参数常用于函数存在默认使用方案的场景,能够简化函数调用,减少重复传参。例如初始化函数,大部分场景下使用默认大小,只有特殊需求时才手动传入自定义数值,此时就适合使用缺省参数。

在类的构造函数中,缺省参数也十分常用,可以用一个构造函数实现多种初始化方式,减少重载函数的数量。

函数重构:

C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同,或者类型不同,这样C++函数调用就表现出了多态行为,更加灵活

重构一:参数类型不同

如:

void swap(int * p1,int* p2)

{

...

}

void swap(double* p1,double* p2)

{

...

}

重构二:参数个数不同

如:

void f() { cout << "f()" << endl; } void f(int a = 10) { cout << "f(int a)" << endl; }

不推荐上述例子中这样写,虽然在意义上构成函数同构,但在f()调用时,会报错,存在歧义,不知道调用的是谁(不传参数,调用谁都有可能)

重构三:参数类型顺序不同

void f(int a, char b) { cout << "f()" << endl; } void f(char a, int b) { cout << "f(int a)" << endl; }

注意:返回值不同不可以作为函数重载

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询