引用的本質和C++類封裝的原理;

引用的本質和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, 變成只讀變量, 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 4224
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章