目录
1、cout与cin
<< 流提取运算符
>> 流插入运算符
#include<iostream>
using namespace std;
int main()
{
int a = 1;
double b = 1.1;
//cout与cin会自动识别内置类型
//不需要像printf与scanf,要指明%d,%lf
//但是需要格式化输出时,cout不如printf,所以哪个方便用哪个
cout << "a=" << a << endl << "b=" << b << endl;
printf("a=%d\nb=%.2lf\n", a, b);
//scanf与cin都默认以空格或换行去间隔
cin >> a>>b;
scanf("%d%.2lf", &a, &b);
cout << "a=" << a << endl << "b=" << b << endl;
printf("a=%d\nb=%.2lf\n", a, b);
return 0;
}
2、缺省参数
缺省参数:声明或定义函数时为函数的参数指定一个缺省值。
调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
全缺省:所有参数都给了缺省值。
半缺省:缺省部分参数,必须连续的从右往左缺省。
注意:缺省参数不能声明和定义中同时出现,要么出现在声明,要么出现在定义
#include<iostream>
using namespace std;
void func1(int a=1,int b=2,int c=3)
{
cout << "a=" << a <<" " << "b=" << b <<" " << "c=" << c << endl;
}
void func2(int a , int b , int c = 3)
{
cout << "a=" << a << " " << "b=" << b << " " << "c=" << c << endl;
}
void func3(int a, int b=2, int c = 3)
{
cout << "a=" << a << " " << "b=" << b << " " << "c=" << c << endl;
}
int main()
{
func1();//没有传参
func1(10);//传一个
func1(10,20);//传二个
func1(10, 20,30);//三个都传
//半缺省
func2(10, 20);
func3(10);
return 0;
}
3、函数重载
所谓重载,就是一词多义。
C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)不同。
#include<iostream>
using namespace std;
//1、类型不同
int Add(int a, int b)
{
cout << a+b<< endl;
return a + b;
}
double Add(double a, double b)
{
cout << a+b << endl;
return a + b;
}
int main()
{
Add(1, 2);
Add(1.1, 2.2);
return 0;
}
#include<iostream>
using namespace std;
//2、顺序不同
void func(int a, double b)
{
cout << "func(int a, double b)" << endl;
}
void func(double b, int a)
{
cout << "func(double b, int a)" << endl;
}
int main()
{
func(1, 1.1);
func(1.1, 1);
return 0;
}
#include<iostream>
using namespace std;
//3、个数不同
void func(int a)
{
cout << "func(int a)" << endl;
}
void func(int a, int b)
{
cout << "func(double b, int a)" << endl;
}
int main()
{
func(1);
func(1,2);
return 0;
}
为什么c++支持函数重载,c不支持?
回忆一下编译器的编译过程:func.h、func.c、test.c
1、预处理:头文件展开、宏替换、条件编译、删注释
2、编译:检查语法,生成汇编代码:func,s、test.s
3、汇编:汇编代码转化为二进制的机器码:func.o、test.o
4、链接
在编译阶段,函数调用会转化为call func( )的指令,圆括号里填的是函数的地址,如果函数定义与调用在同一个文件,则这里会直接填上,如果不在同一个文件,则会在链接时,根据函数名在符号表中寻找。(符号表是生成.o文件后自带的)
因为C直接用函数名去找,因为函数名相同,不知道哪个该对应哪个,而且符号表生成也存在歧义和冲突,所以C不支持函数重载。
C++存在函数名修饰规则,不同的编译器修饰也不相同,有了函数名修饰规则,只要参数不同,符号表与链接用函数名查找时,不会存在歧义和冲突。