C++ 输入输出流通过 cin 和 cout 对象配合流操作符实现类型安全的读写,相比 C 语言 printf/scanf 更便捷且支持自定义类型扩展。缺省参数允许函数定义时指定默认值,调用时可省略部分实参,但需遵循从右向左缺省及从左向右传值的规则。函数重载允许同一作用域内存在同名函数,依据参数个数或类型区分,返回值不同不能作为重载条件。掌握这些特性有助于编写更灵活高效的 C++ 代码。
人间失格3 浏览
一、C++的输入&输出
在 C 语言时代,我们依赖 printf 和 scanf 两个函数完成输入和输出,手动指定格式符、处理类型不匹配的风险是每个开发者的日常。而 C++ 带来了全新的 IO 库,以类型安全、可扩展的设计重构了输入输出的体验。
#include<iostream>//这里函数用三个参数做例子,可以更直观地看出全缺省的作用voidFunc(int a = 10, int b = 20, int c = 30){
std::cout << a << " " << b << " " << c << std::endl;
}
intmain(){
int a = 1, b = 2, c = 3;
Func(a, b, c);
return0;
}
运行结果为:1 2 3。
既然是全缺省,那是不是可以所有参数都不传进去?确实可以,想下面这样:
//这里为了方便,只展示主函数,其余的与上面的代码保持相同intmain(){
int a = 1, b = 2, c = 3;
Func();
return0;
}
运行结果为:10 20 30。
这时候又有读者要问了,能不能只传部分参数的值进去?我不想传完,行不行?答案是可以的,像这样:
intmain(){
int a = 1, b = 2, c = 3;
Func(a); Func(a, b);
return0;
}
#include<iostream>//像这样子调换一下 b 和 c 的位置即可voidFunc(int a = 10, int c = 30, int b = 20){
std::cout << a << " " << b << " " << c << std::endl;
}
intmain(){
int a = 1, b = 2, c = 3;
//只传入 a 和 c 的值Func(a, c);
return0;
}
#include<iostream>//只缺省最后一个参数voidFunc(int a, int b, int c=10){
std::cout << a << " " << b << " " << c << std::endl;
}
intmain(){
int a = 1, b = 2, c = 50;
//这时候就要将前两个参数全部传进去Func(a, b);
return0;
}
运行结果为:1 2 10。
如果想要让两个参数缺省,那就这样子写:
#include<iostream>//void Func(int a = 10,int b,int c = 20) 这种格式是错误的voidFunc(int a, int b = 20, int c=10){
std::cout << a << " " << b << " " << c << std::endl;
}
intmain(){
int a = 1, b = 2, c = 50;
Func(a);
return0;
}
在 C 语言中,我们经常会碰到这样问题:写很多个功能相同的函数但是命名却不能相同,这样就导致了程序员在编写代码时的效率大幅度降低,而 C++ 的函数重载就是为了解决这个问题的。
3.1、函数重载的定义:
C++ 支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是 参数个数 不同或者 类型 不同。这样 C++ 函数调用就表现出了多态行为,使用更灵活。C 语言是不支持同一作用域中出现同名函数的。
#include<iostream>//这是参数类型不相同intadd(int a, int b){
std::cout << "int (a+b) " << a + b << std::endl;
return a + b;
}
doubleadd(double a, double b){
std::cout << "double (a + b) " << a + b << std::endl;
return a + b;
}
//这是参数个数不相同intadd2(int a, int b, int c){
std::cout << "int (a + b + c) " << a + b + c << std::endl;
return a + b + c;
}
intadd2(int a, int b, int c, int d){
std::cout << "int (a + b + c + d) " << a + b + c + d << std::endl;
return a + b + c + d;
}
//这是参数类型顺序不同voidadd3(int a, double b){
std::cout << "int a,int b" << std::endl;
}
voidadd3(double b, int a){
std::cout << "int b,int a " << std::endl;
}
intmain(){
int a = 10, b = 20, c = 30, d = 40;
double a2 = 1.2, b2 = 2.2;
add(a, b);
add(a2, b2);
add2(a, b, c);
add2(a, b, c, d);
return0;
}