缺省参数:函数定义或声明为函数参数指定一个缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则指定的实参
默认参数:当函数调用时没有指定实参默认使用的一个值
特征:带参数的函数列表,必须从右向左添加默认值,也就是说为某个参数设置缺省值,则必须为它右边全部设置缺省值
对于实参列表,必须从左向右依次赋值给形参,不能跳过任何一个形参
void test1(int a=10, int b=20, int c=30)
{
cout << a << " " << b << " " << c << endl;
}
void test2(int a, int b = 200, int c = 300)
{
cout << a << " " << b << " " << c << endl;
}
//void test3(int a,int b=20,int c)//不允许的
int main()
{
test1();
//test1(10, , 20);//实参从左向右必须全部设置实参
test2(10);
return 0;
}
示例:获得前n个字符
char* left(const char* str, int n = 1)//返回前n个字符
{
int i = 0;
char* p=new char[n+1];
for (i = 0; i < n && i < strlen(str); i++)
{
p[i] = str[i];//赋值字符串
}
while (i <= n)
{
p[i++] = ' ';//最后设置为' '
}
return p;
}
int main()
{
const int Arsize = 80;
char sample[Arsize];
cout << "Enter a string :n";
cin.get(sample, Arsize);
char* ps = left(sample, 4);
cout << ps << endl;
delete [] ps;//free old string
ps = left(sample);
cout << ps << endl;
delete[] ps; //free new string
return 0;
}
函数重载
函数重载:同一作用域函数名相同但形参列表不同(个数,类型不同,顺序不同)
void print(int a)
{
cout << "void print(int a)" << endl;
}
void print(int a, double b)
{
cout << "void print(int a, double b)" << endl;
}
void print(double a, int b)
{
cout << "void print(double a, int b)" << endl;
}
int main()
{
print(10);
print(20, 1.1);
print(1.1, 20);
return 0;
}
为什么c不支持函数重载,c++支持?
在c/c++需要经历以下几个阶段?
预处理:头文件展开,宏替换,条件编译,去掉注释*.i
编译:语法检查,生成汇编 *.s
汇编:生成二进制文件 *.o
链接:生成可执行文件 .exe
编译运行生成.o文件 gcc -c fun.cpp 生成.o文件
objdump -d *.o文件生成反汇编
根据函数名修斯规则命名
在cpp中函数名后面会加上类型的首字母
在.c中则不做修改
.c文件
c++内联函数
内联函数与常规函数的区别?
不在于编写方式,而在于c++编译器是如何将他们组合到程序中
常规函数:常规函数调用使程序跳转到另一个函数地址,并在函数时返回.
内联函数:替换函数调用,对于内联函数无需跳转另一个位置而是在相应位置展开
内联与宏内联下:
宏:
宏的优点
- 复用性强
- 宏函数提高效率,减少栈帧建立
缺点:可读性差,没有类型检查,不方便调试
内联函数:空间换时间,省去调用函数额外开销,所以代码很长,递归函数不适宜作为内联函数



