引用的本質和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
int & geta(void)//get a data;
private:
int a;//only one member data;
};int main(int argc, char ** ar**)
編譯器會將它翻譯成大致下面這樣;
struct test
;void test_initialization(test * const mythis, int a)
int & test_geta(test * const mythis)
int main(int argc, char ** ar**)
這裡你可以看到, 在通過變數名呼叫函式是通過編譯器販子將物件(即c語言中的結構體變數)的位址自動以長引用的方式傳遞的, 這裡你大致可以感覺到類封裝的本質就是在將結構體穿個馬甲, 通過橋梁常指標將其連線起來, 也知道,為什麼類中函式不占用大小,只有成員變數有大小;
類封裝將引用中內涵指標變數釋放出來給使用者, 即是this指標, 這裡你也知道了傳來的this指標為什只能在成員函式後面加const修飾, 傳來的this指標加const修飾不能返回成員變數的引用, 因為修飾後相當於const int * cosnt p, 變成唯讀變數,
C 引用的本質
引用的意義 1 引用作為其他變數的別名而存在,因此在一些場合可以代替指標 2 引用相對於指標來說具有更好的可讀性和實用性 引用的本質 1 單獨定義普通引用時 必須初始化,說明很像乙個常量 includeusing namespace std 1 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...
C 引用的本質分析
事物的難度遠遠低於對事物的恐懼!下邊來看看乙個老生常談的交換函式 include using namespace std 引用方式 void swap1 int a,int b 注意 函式引數中的引用不需要初始化 指標方式 void swap2 int a,int b int main int ar...
C 中引用的本質
引用的本質 結論一 當常引用指向了不同型別的資料時,會產生臨時變數,即引用指向的並不是初始化時的那個變數 int age 10 const double rage age age 30 cout age is age endl cout rage is rage endl 相等於int age 10...