知识点1 内联函数(inline)
为什么要使用内联函数(宏函数的缺点)
1、宏函数看起来像函数调用,但是会有隐藏的难以发现的错误
2、在C++中,预处理器无法访问类的成员,预处理器宏不能用作类的成员函数
使用内联函数,继承了宏函数的效率,同时没有调用函数时候进出栈开销,可以像普通函数一样进行参数、返回值类型的安全检查,又可以作为成员函数。内联函数是一个真正的函数,函数的替换发生在编译阶段。
在任何类内部定义的函数即使不加inline也会自动变为内联函数。
内联函数的使用条件(不可以将函数写得过于复杂)
1、不能存在任何形式的循环语句
2、不能存在过多的条件判断语句
3、函数体不能够过于庞大,不能对函数进行取地址操作
内联函数是给编译器的一个建议,编译器可以不接受这种建议;同时如果编写时没有将函数声明成内联函数,编译器有可能把这个函数自动作内联编译。编译器会内联小的、简单的函数。
- inline int my_mul(int x, int y)
- {
- return x*y;
- }
- void test01()
- {
- cout << “my_mul = ” << my_mul(10+10,20+20) << endl;
- }
输出800
知识点2 函数的默认(缺省)参数
C++在声明函数原型的时候可以为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没用传递该参数值,编译器就会用默认值代替。
- int my_add(int x = 10, y = 20)
- {
- return x+y;
- }
- void test02()
- {
- cout << “my_add = ” << my_add(100,200) << endl;//如果传递参数那么默认的参数将无效
- cout << “my_add = ” << my_add(100) << endl;//如果某个参数没有被传参,将启用默认值y=20
- cout << “my_add = ” << my_add() << endl;//x=10,y=20
- }
注意点
1、函数的默认参数从左往右,如果第一个参数用了默认参数,那么这个参数的后面都必须设置默认参数。
2、如果函数声明和定义分开写,函数的声明和定义不能同时设置默认参数。而且建议在声明处给出缺省参数。
知识点3 占位参数
函数的参数只有类型名,没有形参名,这个参数就是占位参数。
由于有类型名,所以函数调用的时候必须给占位参数传参;由于没有形参名,函数的内部无法使用占位参数。
- void func03(int x, int y, int)
- {
- cout << “x = ” << x << “,y = ” << y << endl;
- return;
- }
- void test05()
- {
- func03(10,30,40);
- }
知识点4 函数重载C++的多态性(重要)
函数重载:用同一个函数名在不同场景下可以具有不同的含义
函数重载的意义:方便函数名的使用
函数重载的条件:同一个作用域下、参数个数不同、参数类型不同、顺序不同
- void myFunc(int a)
- {
- cout << “myFunc in int” << endl;
- }
- void myFunc(int a, int b)
- {
- cout << “myFunc in int,int” << endl;
- }
- void myFunc(int a, double b)
- {
- cout << “myFunc in int, double” << endl;
- }
- void myFunc(double a, int b)
- {
- cout << “myFunc in double, int” << endl;
- }
- void test06()
- {
- myFunc(10);//int
- myFunc(10,20);//int int
- myFunc(10,20.2);//int double
- myFunc(10.1,20);//double int
- }
注意:
1、函数的返回值类型不能够作为函数重载的依据
2、函数重载和默认参数一起使用,需要额外注意二义性问题的产生
- void myFunc02(int a)
- {
- cout << “myFunc02 in int” << endl;
- }
- void myFunc02(int a, int b = 10)
- {
- cout << “myFunc02 in int,int” << endl;
- }
- void test06()
- {
- //myFun02(int a) and myFun02(int a, int b = 10) are OK
- myFunc02(10);//产生二义性
- }
函数重载的原理
编译器在幕后自动转换相同名称函数
知识点5 C++和C的混合编程
c文件.c中函数对应头文件.h,在.h中用
- #if __cplusplus
- extern “C”{
- #endif
- extern void funInC();
- #if __cplusplus
- }
- #endif //
- #endif //