C++类的内联成员函数应放在哪
今天復(fù)習(xí)C++ Primer的時(shí)候,看到了關(guān)于C++類的內(nèi)聯(lián)成員函數(shù)的放置,應(yīng)該放在頭文件中。那么這到底是為什么
呢?僅僅是一種代碼規(guī)范問(wèn)題還是必須這樣做呢?
下面我就來(lái)講講我自己的理解吧。要徹底理解這個(gè)問(wèn)題,首先就要了解下函數(shù)的聲明和定義了。我們知道,函數(shù)可以
在多處聲明,但只能在一個(gè)地方定義,不然就會(huì)出現(xiàn)重定義。大部分函數(shù)默認(rèn)是外部鏈接,而inline函數(shù)默認(rèn)為內(nèi)部鏈
接。也就是說(shuō)inline函數(shù)只能在本文件中使用,對(duì)其他文件是不可見(jiàn)的。一般我們使用某個(gè)類的時(shí)候,都是在文件中加
上該類的頭文件,以便我們可以使用該類的接口。而我們類的成員函數(shù)的實(shí)現(xiàn)都是放在相應(yīng)的.cpp文件中的,而在.h
文件中聲明。這樣我們便可以通過(guò).h文件中的成員函數(shù)的聲明找到其定義,繼而使用成員函數(shù)了。但如果將inline函數(shù)
放在.cpp文件中,那么其只對(duì).cpp文件有效,這樣我們就無(wú)法訪問(wèn)它了。所以我們將其放在類的聲明的頭文件中,這
樣通過(guò)包含該頭文件來(lái)使用它。
下面寫個(gè)實(shí)際的例子來(lái)說(shuō)明一下,我先把內(nèi)聯(lián)函數(shù)放到類聲明的頭文件中:
/*test.h*/ #ifndef TEST_H #define TEST_H#include <iostream> using std::cout; using std::endl;class test { public:test():x(10){}inline void print();void display (int y); private:int x; };void test::print() {cout << x << endl; }#endif
/*test.cpp*/ #include <iostream> #include "test.h" using std::cout; using std::endl;void test::display(int y) {cout << x * y << endl; }
運(yùn)行結(jié)果正常,下面來(lái)看看將內(nèi)聯(lián)函數(shù)放到.cpp中去:
/*test.h*/ #ifndef TEST_H #define TEST_H#include <iostream> using std::cout; using std::endl;class test { public:test():x(10){}inline void print();void display (int y); private:int x; };#endif
/*test.cpp*/ #include <iostream> #include "test.h" using std::cout; using std::endl;void test::print() {cout << x << endl; }void test::display(int y) {cout << x * y << endl; }
測(cè)試函數(shù)和上面的main.cpp是一樣的。這是出現(xiàn)了錯(cuò)誤:
error LNK2019: 無(wú)法解析的外部符號(hào) "public: void __thiscall?test::print(void)" (?print@test@@QAEXXZ),該符號(hào)在函
數(shù) _main 中被引用。如果我將測(cè)試函數(shù)改為:
int main() {test T;T.display(10);//T.print();system("pause");return 0; }那么運(yùn)行結(jié)果正常。從此可以得出結(jié)論:內(nèi)聯(lián)函數(shù)放在頭文件或者.cpp中都是沒(méi)有錯(cuò)的,但如果我們需要在程序中訪
問(wèn)它,那么就必須將其放在頭文件中。
轉(zhuǎn)載自《 ?
C++類的內(nèi)聯(lián)成員函數(shù)應(yīng)放在哪
》
總結(jié)
以上是生活随笔為你收集整理的C++类的内联成员函数应放在哪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java常用设计模式及其使用场景
- 下一篇: s3c2440移植MQTT