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

2020-05-03  本文已影响0人  普朗tong

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)

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

评价

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读