ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

看完少踩 80% 的坑:C++ 输入输出、缺省参数、函数重载,一次讲透还不秃头

看完少踩 80% 的坑:C++ 输入输出、缺省参数、函数重载,一次讲透还不秃头 何时秋风初拂面已觉寒气暗侵衣。一叶梧桐惊岁晚满庭风雨送夏归。1.C的输入和输出使用C的输入和输出需要包含头文件#includeiostreamcin 与 cout 位于 std 命名空间内使用时需要通过 std:: 限定或是通过 using 引入命名空间C 的输入输出是基于流对象实现的核心为标准输入流 cin 与标准输出流 cout二者定义在 std 命名空间中是对控制台输入输出的面向对象封装。cin 负责从键盘读取数据cout 负责向控制台输出内容还有 cerr 专门用来输出错误信息。相较于 C 语言的 scanf 和 printfcin 与 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::cinid//先输入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():a10,b20,c30情景二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 printint 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; }注意返回值不同不可以作为函数重载
返回列表