内联函数和函数重载

内联函数

  宏可以避免函数调用带来的开销,但存在两个问题:1)宏没有作用域,没有类型检测,另外定义宏时,需要时刻注意加括号,除此之外,当传入变量自增时,会出现不可避免的错误。2)C++中宏不能作为类的成员函数,因为预处理器不能访问类成员。

  内联函数主要为了替代宏,另外,类中的成员函数默认加了inline。

1 inline void func(); //声明
2 
3 inline void func(){ //定义时也必须加上inline
4    cout << "none" << endl;         
5 }

  以下情况不能使用内联函数:1)不能存在任何形式的循环语句;2)不能存在过多的条件判断语句;3)函数体不能过于庞大;4)不能对函数进行取址操作,因为内联函数直接将函数体替换掉,本来就丢了函数入口,再次取地址没有意义。

  另外,内联函数对于编译器而言只是一个建议,编译器不一定会接受这种建议,即使没有声明内联函数,编译器可能也会内联一些小的简单的函数。

函数默认参数和占位参数

这个东西用到的时候比较少,函数默认参数,如果有一个位置有了默认值,那么从后逐个位置开始,从左往右都必须有默认值,另外函数声明和实现只能有一个默认值,否则会不明确,报错

函数占位参数,也可以有默认值,另外C语言中没有默认参数和占位参数

void test(int a){
  cout << "what"<< endl;  
}

当函数中有占位参数时,调用时必须提供这个参数

函数重载

  C++的函数名称可以重复,称为函数重载。

  注意事项:1)其中必须在同一作用域下的函数名称相同,不能是一个在全局,一个局部,或者不同的代码块中;2)可以根据函数参数的个数、类型(const也可以作为重载条件)、顺序不同进行函数重载,但不能用函数返回值进行重载。3)当函数重载遇到函数默认参数时,要注意二义性。

 1 class Animal_{
 2     void func(){};//这个函数跟其他函数不在一个作用域,不叫重载
 3 };
 4 
 5 void func(){
 6     cout << "what?
" << endl;
 7 }
 8 
 9 void func(int a){
10     cout << "what?
" << endl;
11 }
12 
13 void func(int a, char b = 'c'){//有默认参数时,需要注意二义性,因为调用时只传入一个a就gg了
14     cout << "what?
" << endl;
15 }
16 
17 void func(double b){
18     cout << "what?
" << endl;
19 }
20 
21 void func(int a, double b){
22     cout << "what?
" << endl;
23 }
24 //引用重载
25 void func2(int &a){
26     cout << "int &a
" << endl;
27 }
28 
29 void func2(const int &a){
30     cout << "const
" << endl;
31 }
32 
33 
34 int main(){
35     int a = 20;
36     func2(a); //输出int &a
37     func2(10); //输出const,因为调用int &a的函数不合法,引用没有分配内存
38     system("pause");
39     return 0;
40 }
原文地址:https://www.cnblogs.com/qinguoyi/p/10216167.html