今天覆習c++ primer的時候,看到了關於c++類的內聯成員函式的放置,應該放在標頭檔案中。那麼這到底是為什麼
呢?僅僅是一種**規範問題還是必須這樣做呢?
下面我就來講講我自己的理解吧。要徹底理解這個問題,首先就要了解下函式的宣告和定義了。我們知道,函式可以
在多處宣告,但只能在乙個地方定義,不然就會出現重定義。大部分函式預設是外部鏈結,而inline函式預設為內部鏈
接。也就是說inline函式只能在本檔案中使用,對其他檔案是不可見的。一般我們使用某個類的時候,都是在檔案中加
上該類的標頭檔案,以便我們可以使用該類的介面。而我們類的成員函式的實現都是放在相應的.cpp檔案中的,而在.h
檔案中宣告。這樣我們便可以通過.**件中的成員函式的宣告找到其定義,繼而使用成員函式了。但如果將inline函式
放在.cpp檔案中,那麼其只對.cpp檔案有效,這樣我們就無法訪問它了。所以我們將其放在類的宣告的標頭檔案中,這
樣通過包含該標頭檔案來使用它。
下面寫個實際的例子來說明一下,我先把內聯函式放到類宣告的標頭檔案中:
[cpp]
/*test.h*/
#ifndef test_h
#define test_h
#include
using std::cout;
using std::endl;
class test
inline void print();
void display (int y);
private:
int x;
};
void test::print()
#endif
[cpp]
/*test.cpp*/
#include
#include "test.h"
using std::cout;
using std::endl;
void test::display(int y)
[cpp]
/*main.cpp*/
#include
#include "test.h"
using namespace std;
int main()
執行結果正常,下面來看看將內聯函式放到.cpp中去:
[cpp]
/*test.h*/
#ifndef test_h
#define test_h
#include
using std::cout;
using std::endl;
class test
inline void print();
void display (int y);
private:
int x;
};
#endif
[cpp]
/*test.cpp*/
#include
#include "test.h"
using std::cout;
using std::endl;
void test::print()
void test::display(int y)
測試函式和上面的main.cpp是一樣的。這是出現了錯誤:
error lnk2019: 無法解析的外部符號 "public: void __thiscall test::print(void)" (?print@test@@qaexxz),該符號在函
數 _main 中被引用。如果我將測試函式改為:
[cpp]
int main()
那麼執行結果正常。從此可以得出結論:內聯函式放在標頭檔案或者.cpp中都是沒有錯的,但如果我們需要在程式中訪
問它,那麼就必須將其放在標頭檔案中。
c 內聯成員函式
內聯成員函式 類中的成員函式分為一般成員函式和內聯成員函式。把成員函式的 放入類宣告中,這種方式定義的類成員函式就叫內聯成員函式 隱式定義 程式使用內聯成員函式的方式與一般的成員函式的呼叫方式一樣。內聯函式和外聯函式之間的區別在於 定義乙個內聯函式時,編譯器會把內聯函式的 替換到程式中 這樣 效率要...
c ,內聯成員函式
內聯成員函式 有兩程方式實現內聯成員函式 1 在聲名成員函式的同時定義成員函式體 2 宣告成員函式時,在最前面加上inline關鍵字 在定義成員函式時也在最前面加上inline關鍵字 建議inline函式在標頭檔案中宣告,以便被不同檔案使用。同c 注意 內聯函式中如果出現條件或迴圈語句,則不會被真正...
C 實操之內聯成員函式介紹
目錄 在c語言中,我們使用了巨集函式,這是編譯器用來減少執行時間的一種優化技術。那麼問題來了,在c 中,有什麼更好的方法來解決這個問題呢?我們引入了內聯函式,這是編譯器用來減少執行時間的一種優化技術。我們將討論內聯函式的 what,why,when how 內聯函式是c 的乙個增強功能,可以減少程式...