c++編程經(jīng)驗(yàn)
1.關(guān)于前置引用聲明
最近用到一些前置聲明,所以做了一些研究。
前置聲明的原理:只能定義指針或者引用,因?yàn)榫幾g器已經(jīng)知道分配多大的內(nèi)存了。
有人說(shuō)不必要的include,會(huì)減少編譯時(shí)間。(不在.h中include,難道就不用在.cpp中包含了嗎?),所以減少頭文件之間的循環(huán)include,是前置聲明的一大作用。
2.定義
類的向前引用聲明只適用于指針和引用。
class A;
class B
{
public:
A* m_a; //(不能A m_a)
}
3.向前聲明的限制
(1)不能定義foo類的對(duì)象;
(2)可以用于定義指向這個(gè)類型的指針或引用。(很有價(jià)值的東西);
(3)用于聲明(不是定義)使用該類型作為形參或者返回類型的函數(shù)。
4.實(shí)例
c++編譯器做的事情主要是:1.掃描符號(hào);2.確定對(duì)象大小。
所以很多時(shí)候并不需要將類都include進(jìn)來(lái)。
比如:
- 1.由于所有對(duì)象類型的引用所占用的空間都是相同大的,所以c++編譯器很好確認(rèn)對(duì)象大小。
class string;
class Sample
{
private:
string &s;
}
這里只需要做一個(gè)string的前向聲明就可以了,不需要#include <string>,因?yàn)橐煤椭羔樁际枪潭ù笮〉摹?/p>
- 2.聲明成員函數(shù)的形參或者是返回類型,也可以利用前向聲明的性質(zhì)
class string;
class foo;
class Sample
{
public:
foo foo_test(foo &);
private:
string &s;
foo *f;
};
這里,我根本沒(méi)有定義一個(gè)foo類,但是還是可以這樣用,因?yàn)槌蓡T函數(shù)不占類對(duì)象的大小,所以c++編譯器還是可以確定對(duì)象的大小。
前向聲明的作用在于告訴編譯器這是一個(gè)在別的地方定義的類型。這樣C++編譯器就能生成正確的符號(hào)表了。