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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。