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;
通常做法是省略原型,將整個定義(函數頭和實現代碼)放在函數聲明的地方。
評價
優點:避免函數調用時的額外開銷
缺點:由于內聯函數的函數體在代碼段中會出現多個“副本”,因此會增加代碼段的空間。
本質:以犧牲代碼段空間為代價,提高程序的運行時間的效率。
適用場景:函數體很“小”,且被“頻繁”調用。