目录
(2)、第二种情况,在类体内声明(可选)在类体外inline定义:
1、内联函数的定义:
内联函数,是编译器用来减少执行时间的一种优化技术。
内联函数是C++的一个增强功能,可以减少程序的执行时间。函数可以通过指示编译器,使其成为内联函数,这样编译器就可以取代那些被调用的函数定义。编译器会在编译时替换内联函数的定义,而不是在运行时引用函数定义。(这只是建议编译器将函数内联,如果函数很大编译器可以忽略 "内联 "请求,将函数作为普通函数处理。)
在类成员列表中定义的成员函数默认为内联成员函数,所以可以省略inline关键字。一般含有几行代码的成员函数通常被内联声明,或者说可以在类的定义中定义较短的函数。
2、内联函数的意义:
对于内联函数,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换;
而对于普通函数,都是在运行时候才被替代。这其实就是个空间代价换时间的例子。
3、一般表达式:
要使任何函数成为内联函数,在函数声明或定义前使用关键字 "inline"。
4、使用内联函数的注意事项:
- 使用inline定义的内联函数必须将类的声明和内联成员函数的定义都放在同一个文件中,否则编译时无法进行代码的置换;
- 内联函数一般都是1-5行的小函数, 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用;
- 不要在内联函数内使用循环语句和开关语句;
- 有些函数即使声明为内联的也不一定会被编译器内联, 比如虚函数和递归函数就不会被正常内联;
- 递归函数不可以成为内联函数;
5、内联的方法
(1)、第一种情况,在类体内显示声明并定义:
class A
{
public:
inline int add(int a, int b)
{
return (a+b);
}
};
(2)、第二种情况,在类体内声明(可选)在类体外inline定义:
class A
{
public:
int add(int a, int b);
};
inline int A::add(int a, int b)
{
return (a+b);
}
(3)、第三种情况,是内联函数,但不是内联成员函数:
inline int add_two (int a, int b)
{
return (a+b);
}
6、什么时候用内联(满足以下至少一条):
- 函数体很短;
- 函数被多次调用;
7、举例:
/*内联成员函数*/
#include<iostream>
using namespace std;
class Tan
{
private:
int age;
char* name;
char* sex;
public:
inline void set(int age, char* name, char* sex);
/*inline*/ void show(); //本例无特点:没有在用途上区分开有无关键字inline,即使逐行调试,现象也一样
};
inline void Tan::set(int age, char* name, char* sex)
{
Tan::age = age;
Tan::name = name;
Tan::sex = sex;
}
/*inline*/ void Tan::show()
{
cout << "姓名:" << name << endl << "年龄:" << age << endl << "性别:" << sex << endl;
}
int main()
{
Tan tan1{};
tan1.set(24, (char*)"老檀时代", (char*)"man");
tan1.show();
Tan tan2[3]{};
tan2[0].set(24, (char*)"老檀时代0", (char*)"man");
tan2[1].set(25, (char*)"老檀时代1", (char*)"man");
tan2[2].set(26, (char*)"老檀时代2", (char*)"man");
tan2[0].show();
tan2[1].show();
tan2[2].show();
return 0;
}
/*运行结果:
姓名:老檀时代
年龄:24
性别:man
姓名:老檀时代0
年龄:24
性别:man
姓名:老檀时代1
年龄:25
性别:man
姓名:老檀时代2
年龄:26
性别:man */
8:结论:
普通函数 | 函数调用时,复制实参去调用函数 | 复制实参调用函数一定不会影响实参的值,即引用的函数执行后不会返回实参的当前值。如果想要影响实参的数值,需要引用实参的指针去调用函数 | 多次调用函数会增加编译器的负担 |
内联函数 | 用实参和函数体替换函数调用的操作 | 用实参和函数体替换函数的调用一定影响实参的当前值。 | 多次调用时使用内联函数会减少编译器的负担 |