1.函数参数的默认值
c++参数默认值的赋值
必须从右向左,依次赋默认值
函数参数的默认值不可以重复赋值
当main函数编译生成指令之后,其他文件中修改某一参数不会造成影响,只有在同一文件中重复赋值才会出错
下面是具体的示例代码:
#include<iostream>
using namespace std;
//int fun(int a= 100, int b , int c); //error赋值必须是从右向左,c和b还没有被赋值
int fun(int a, int b, int c = 40);
int main()
{
fun(10,20);//入参的顺序也是从右向左,所以c = 40,b = 20,a = 10
return 0;
}
//int fun(int a, int b, int c = 10) //error 在上面函数申明的时候已经给c赋过值了,不能重复赋值
int fun(int a, int b, int c)
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
return 0;
}
2.内联函数
内联函数的形式:在普通函数前面加上inline
内联函数会在调用点展开
代码示例:
inline int fun(int a, int b)//内联函数
{
return a - b;
}
内联函数在不同版中的特点:
在debug版本中:在这个版中可以调试,会生成一个local符号,也会进行函数栈帧开辟回退之类的动作
在release版本中:不可以调试,不会产生符号,也不会进行函数栈帧回退之类的动作,但会在调用点进行展开
内联函数一定会展开吗?inline函数知识对编译器一个建议,编译器会在具体的情况下考虑是否处理成内联
3.宏:最大的隐患是没有安全检查
具体的代码如下:
#define SUM(a,b){a+b}
//宏定义是在预编译时期处理的,而其他函数传参是在编译时期
int main()
{
int a = 10;
int b = 20;
c = SUM(a,b);//c = a+b;
return 0;
}
宏的特点:
不存在栈帧的开辟
不存在参数的带入
不存在返回值的带出
不存在参数的清楚
不存在类型的检查
不可以调试
宏、static函数和内联函数的区别:
inline static 宏
debug版本中会生成local符号 产生符号 不产生符号
release版本中不会生成符号
debug版本中会进行栈帧操作 进行栈指针操作 在调用点展开
release版中直接在调用点展开 (预编译期)
(编译期)
可以调试 可以调试 可以调试
有类型检查 有类型检查 无类型检查
4.重载
C语言中
在c语言中靠的是函数名来生成符号,若是函数名一样,在编译时期生成的符号是一样的
C++中
在C++中,符号的生成是靠函数名和函数的参数列表生成的,这就是函数的重载
函数的重载需要注意一下几个方面:函数名要相同
函数参数要不同
必须处于同一作用域
重载函数的示例:
bool compare_int(int a, int b)
{
return a > b;
}
bool compare_float(float a, float b)
{
return a > b;
}
bool compare_double(double a, double b)
{
return a > b;
}
bool compare_char(char a, char b)
{
return a > b;
}
bool compare_charPtr(char *a, char*b)
{
return strcmp(a, b);
}
上面代码中每一个函数重载之后得到的类型不同,但是有时候会出现给的参数的类型不明确,则函数重载会失败,请看下面代码:
bool compare(int a, int b)//compare_int_int
{
cout << typeid(a).name() << " " << typeid(b).name() << endl;
return a == b;
}
bool compare(float a, float b)//compare_float_float
{
cout << typeid(a).name() << " " << typeid(b).name() << endl;
return a == b;
}
bool compare(char a, char b)
{
cout << typeid(a).name() << " " << typeid(b).name() << endl;
return a == b;
}
bool compare(short a, short b)
{
cout << typeid(a).name() << " " << typeid(b).name() << endl;
return a == b;
}
bool compare(char *a, char*b)
{
cout << typeid(a).name() << " " << typeid(b).name() << endl;
return !strcmp(a, b);
}
int main()
{
compare(10.1, 10.2);
return 0;
}
此时程序就会出错,主函数中给出的参数值是double类型,而double类型可以转换成float,char,int,char*,此时主函数就不知道调用那个函数了,所以一定要明确类型。
今天就先介绍这些吧,后续还有c和c++的区别......