何时秋风初拂面?已觉寒气暗侵衣。
一叶梧桐惊岁晚,满庭风雨送夏归。
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再输入dcin 读取字符串时,遇到空格就会停止读取,如果需要读取包含空格的整行文本,应当选用 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; }注意:返回值不同不可以作为函数重载