引用的本質和C++類封裝的原理, 談到這個問題就要,首先連接長指針變量;即型如int * const p,他表示的是p的指向不可變,指向的內容可讀可寫;
int a = 10;
int * const p = &a;
*p = 20;
cout << *p << endl;
而如果使用const int *const p這樣指針p就完全變爲只讀的,如;
int a = 10;
const int * const p = &a;
*p = 20;//編譯器報錯;
cout << *p << endl;
這個取地址和取內容全是自己手動操作的, 而引用是什麼做法, 化繁爲簡, 將去地址和取內容自動化, 封閉起來看不到;
指針必須初始化的原因是,他的內部被const修飾,所以指針初始化不能賦值;
如;
int a = 10;
int & re = a; //等價於 int * const p = &a;即自動取地址, 編譯器做的;不過這個p是內藏的,在彙編代碼下能看到;相當於對用戶封裝;
re = 20;//等價 *p = 20;即他自動取內容運算;
所以他本質就是常指針, 封裝了指針操作, 內部依然是指針, 只不過用戶看不到, 以爲就是變量別名;
下面要講的封裝的本質就和類的長指針有巨大關係;
我們先看一個列子;
class Test
{
public:
Test(int a)//Constructor;
: a(a)
{
}
int & GetA(void)//Get a data;
{
return this->a;
}
private:
int a;//only one member data;
};
int main(int argc, char ** argv)
{
Test t;
cout << t.GetA() << endl;
}
編譯器會將它翻譯成大致下面這樣;
struct Test
{
int a;
};
void Test_Initialization(Test * const myThis, int a)
{
myThis->a = a;
}
int & Test_GetA(Test * const myThis)
{
return myThis->a;
}
int main(int argc, char ** argv)
{
Test t;
Test_Initialization(&t, 0);
cout << Test-GetA(&t) << endl;
}
這裏你可以看到, 在通過變量名調用函數是通過編譯器販子將對象(即C語言中的結構體變量)的地址自動以長引用的方式傳遞的, 這裏你大致可以感覺到類封裝的本質就是在將結構體穿個馬甲, 通過橋樑常指針將其連接起來, 也知道,爲什麼類中函數不佔用大小,只有成員變量有大小;
類封裝將引用中內涵指針變量釋放出來給用戶, 即是this指針, 這裏你也知道了傳來的this指針爲什只能在成員函數後面加const修飾, 傳來的this指針加const修飾不能返回成員變量的引用, 因爲修飾後相當於const int * cosnt p, 變成只讀變量,