C++-输入输出&&缺省参数
今天继续学习C++的输入输出和缺省参数部分,这个也是比较重要的一个部分!
3.C++的输入输出
1.使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用
推荐使用的版本
#include<iostream>//input ouput stream 输入输入流 C++输入输出头文件 using namespace std;//C++库的实现定义在一个叫std的命名空间中 //这样写 ==>把std这个命名空间的内容展开到全局
老版本
#include<iostream.h> // VC6.0 -> 比较老版本的库,没有命名空间的
2.使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
c语言中使用
scanf 和 printf进行输入输出,而C++也有输入输出,那就是cin 和 cout,其中cin是输入,搭配>>使用;cout是输出,搭配<<使用.
输出 cout
搭配 << 流插入运算符
#include<iostream>
//std命名空间的内容全局展开
using namespace std;
int main()
{
cout << "Hello world\n" ;
cout << "Hello world" << endl;//endl ->相当于\n
cout << "Hello" << " " << "world" << endl;
return 0;
} #include<iostream>
//只展开std命名空间里面的cout和endl成员
using std::cout;
using std::endl;
int main()
{
int a = 0;
double d = 3.14;
//自动识别变量的类型
cout << "a = " << a << " d = " << d<< endl;
return 0;
} 
cout打印的默认就是你写的,不会把小数后面的也打印出来
int main()
{
double d = 3.14;
cout << "d = " << endl;
return 0;
} 
输入 cin
搭配 >> 流提取运算符, cin也不可读取空格,会自动忽略 和scanf类似
#include<iostream>
//std命名空间的内容展开到全局
using namespace std;
int main()
{
int a = 0;
double b = 0;
//自动识别类型
cin >> a;
cin >> b;
printf("a = %d b = %.2lf\n", a, b);
return 0;
} 
#include<iostream>
//只展开std命名空间里面的cin成员
using std::cin;
int main()
{
int a = 0;
double b = 0;
cin >> a;
cin >> b;
printf("a = %d b = %lf\n", a, b);
return 0;
} 4.缺省参数
概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参,
缺省参数的例子
void Test(int a = 0)
{
cout<<"a = "<< a <<endl;
}
int main()
{
Test();//没有传参时,使用参数的默认值
Test(1);//传参时,使用指定的实参
return 0;
} 
全缺省参数
所以参数都给了缺省值
void func(int x = 0, int y = 1)
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << endl;
}
int main()
{
func();
func(3);
func(3, 4);
//func( ,4)//只给y赋值,x取默认值,err
//不能在调用的时候指定传给谁
} 
半缺省参数
缺省部分参数,并且默认值必须从右往左依次给出
void func(int x, int y = 0)
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << endl;
}
int main()
{
func(1);
func(1,2);
//func();//err
} 
半缺省参数必须从右往左依次来给出,不能间隔着给
即:必须从右往左缺省,必须连续的缺省,不能跳着缺省
void func(int x = 0,int y,int z = 1) //err
{}
void func(int x,int y = 0,int z) //err
{}
void func(int x,int y ,int z = 0) //OK
{} 缺省参数不能在函数声明和定义中同时出现
//func.cpp中
void func(int x, int y = 0)
{}
//func.h中
void func(int x, int y = 0); 
原因:
如果声明与定义函数的位置同时出现缺省参数,恰巧两个位置提供的值不同,编译器就无法确定到底该用那个缺省值,
如:
//func.cpp中
void func(int x, int y = 0)
{}
//func.h中
void func(int x, int y = 2); ==解决办法==:要么在声明中写缺省参数,要么在定义中写缺省参数,推荐写在:声明,因为查看代码的时候一般先看它的声明
//func.cpp中
void func(int x, int y)
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << endl;
}
//func.h中-写在声明里面
void func(int x, int y = 2);
int main()
{
func(1);
func(3,4);
return 0;
} 
缺省值必须是常量或者全局变量
//缺省值为全局变量
int c = 0;
void func(int x,int y = c)
{}
//缺省值为常量
void func(int x,int y = 1)
{} - 总结
1.半缺省参数必须从右往左依次来给出,不能间隔着给
2.缺省参数不能在函数声明和定义中同时出现
3.缺省值必须是常量或者全局变量
4.C语言不支持(编译器不支持)
使用缺省参数的好处(例子)
struct Stack
{
int* a ;
int capacity;
int size;
}
//使用缺省参数
void StackInit(struct Stack* ps,int capacity = 4)
{
ps- > a = (int*)malloc(sizeof(int)*capacity);
ps -> size = 0;
ps -> capacity = capacity;
}
int main()
{
struct Stack st;
//StackInit(&st);//不知道栈最多存多少数据,就用缺省参数初始化
StackInit(&st,100);//知道栈最多存100个数据,用显示传值,这样可以减少增容次数,提高效率
} 增容是有代价的:realloc ():若后面空间不够,要重新开辟空间,把原空间数据拷贝过去,然后释放原空间
缺省参数函数相比于普通的函数调用时更灵活,比如在栈的初始化时可以通过传入指定的参数开辟对应大小的内存空间,如果不指定参数则开辟默认大小,
#C/C++#
