c++編程經(jīng)驗
1.關(guān)于前置引用聲明
最近用到一些前置聲明剩瓶,所以做了一些研究驹溃。
前置聲明的原理:只能定義指針或者引用,因為編譯器已經(jīng)知道分配多大的內(nèi)存了儒搭。
有人說不必要的include吠架,會減少編譯時間。(不在.h中include,難道就不用在.cpp中包含了嗎搂鲫?)傍药,所以減少頭文件之間的循環(huán)include,是前置聲明的一大作用魂仍。
2.定義
類的向前引用聲明只適用于指針和引用拐辽。
class A;
class B
{
public:
A* m_a; //(不能A m_a)
}
3.向前聲明的限制
(1)不能定義foo類的對象;
(2)可以用于定義指向這個類型的指針或引用擦酌。(很有價值的東西)俱诸;
(3)用于聲明(不是定義)使用該類型作為形參或者返回類型的函數(shù)。
4.實例
c++編譯器做的事情主要是:1.掃描符號赊舶;2.確定對象大小睁搭。
所以很多時候并不需要將類都include進來。
比如:
- 1.由于所有對象類型的引用所占用的空間都是相同大的笼平,所以c++編譯器很好確認(rèn)對象大小园骆。
class string;
class Sample
{
private:
string &s;
}
這里只需要做一個string的前向聲明就可以了,不需要#include <string>,因為引用和指針都是固定大小的寓调。
- 2.聲明成員函數(shù)的形參或者是返回類型锌唾,也可以利用前向聲明的性質(zhì)
class string;
class foo;
class Sample
{
public:
foo foo_test(foo &);
private:
string &s;
foo *f;
};
這里,我根本沒有定義一個foo類,但是還是可以這樣用晌涕,因為成員函數(shù)不占類對象的大小滋捶,所以c++編譯器還是可以確定對象的大小。
前向聲明的作用在于告訴編譯器這是一個在別的地方定義的類型余黎。這樣C++編譯器就能生成正確的符號表了重窟。