C++类里面的哪些成员函数是内联函数?

C++类里面的哪些成员函数是内联函数

1.隐式内联

class Person
{
public:
    Person(const string &name)
    {
        Name = name;
    }
    void printName()//printName 定义在类里面是隐式内联函数
    {
        cout << Name << endl;
    }
private:
    string Name;
};

2.在类里面显示声明,在类外面定义

class Person
{
public:
    Person(const string &name)
    {
        Name = name;
    }
    inline void printName();//成员被函数前加了inline是显式内联函数
    //在类里面显式声明
private:
    string Name;
};
void Person::printName()
{//在类外面定义
    cout << Name << endl;
}

3.“追加”内联。表示在类里面没有显式声明,在类外显示定义了内联。

class Person
{
public:
    Person(const string &name)
    {
        Name = name;
    }
    void printName();
    //在类里面没有显式声明
private:
    string Name;
};
inline void Person::printName()//成员被函数前加了inline是显式内联函数
{//在类外面显式定义
    cout << Name << endl;
}

4.第四种常见的成员函数不是内联函数。定义不再类里面,且声明和定义都没有inline。

class Person
{
public:
    Person(const string &name)
    {
        Name = name;
    }
    void printName();
    //在类里面没有显式声明
private:
    string Name;
};
void Person::printName()//不是内联函数
{//在类外面也没有显式定义
    cout << Name << endl;
}

C++内联函数

c 语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。

但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错。

比如以下几种情况:

//定义一个计算平方的宏函数
#define SQUARE(X) (X*X)
//这不是通过传递参数,而是通过文本替换的方式来实现的
a=SQUARE(5.0)      //会被替换为5.0*5.0
b=SQUARE(4.5+7.5)  //会被替换为4.5+7.5*4.5+7.5
c=SQUARE(c++)      //会被替换为c++*c++
//上述示例只有第一个能正常工作,可以通过使用括号来改进
#define SQUARE(X) ((X)*(X)
//但依然存在问题:不能按值传递,如第三个中,会先将c++然后计算c平方,不符合预期结果(先计算c平方,再指向c++)

因此有了内联函数(inline function)

要使用该特性,必须采取下列措施之一:

  • 在函数声明前加关键字inline;

  • 在函数定义前加关键字inline;

    通常做法是省略原型,将整个定义(函数头和实现代码)放在函数声明的地方。

评价

优点:避免函数调用时的额外开销

缺点:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间。

本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。

适用场景:函数体很“小”,且被“频繁”调用。

参考
C++类里面的哪些成员函数是内联函数?
C++ Prime Plus

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。