C++類的this指針,靜態成員,友元函數友元類
文章目錄
1. This指針
2. 靜態成員
3. 友元函數友元類
1. This指針
在上篇講C++中類,對象,封裝,繼承(派生),多態的時候,this指針出現在成員函數中,并使用->成員提取符操作成員變量。
在 C++ 中,每一個對象都能通過 this 指針來訪問自己的地址,this 指針是所有成員函數的隱含參數,實際上成員函數默認第一個參數為T* const register this,this指針在成員函數的開始執行前構造的,在成員的執行結束后清除。
例如我們自定義一個print函數
class Animal { String name; void print() { cout<
1
2
3
4
5
6
7
8
但是在編譯器看來,它的原型是這樣的:
class Animal { String name; void print(T* const register this) { cout<
1
2
3
4
5
6
7
8
因此,在成員函數內部,它可以用來指向調用對象,并且只可以在成員函數中調用,對于全局函數,靜態函數,友元函數,都不能使用this指針。
一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結果。
2. 靜態成員
在變量或者函數前面加上關鍵字:static,它就變了一個靜態變量或者靜態函數,當static出現在類中被修飾成員中,被成為靜態成員。
我以前問過老師一個很逗比的問題,給大家分享一下,代碼簡化一下就是這樣的:
class Animal { public: static int age; } Animal an[10]; for (int i = 0; i < 10; i++) { aa[i].age = i; }
1
2
3
4
5
6
7
8
9
10
11
當我輸出這10個對象的age的時候,我懵了,10個age都是同一個值,且是最后一個數的值,為什么,就是static這個關鍵字搞的鬼。
static這個關鍵字將成員變量age設定為靜態變量。
什么是靜態變量,static 修飾的靜態局部變量只執行初始化一次,而且延長了局部變量的生命周期,直到程序運行結束以后才釋放。
也就是說在函數體內,靜態變量具有“記憶”功能,即一個被聲明為靜態的變量在這一函數被調用的過程中其值維持不變,每個對象有各自的成員變量,但是他們共享靜態變量。所以靜態變量相當于是大家的共有資源。
所以this指針不能在靜態函數中使用,靜態函數如同靜態變量一樣,他不屬于具體的哪一個對象,靜態函數表示了整個類范圍意義上的信息,而this指針卻實實在在的對應一個對象,所以this指針不能被靜態函數使用,在靜態函數里面,不可以直接訪問非靜態成員。
靜態數據成員和普通數據成員一樣遵從public,protected,private訪問規則。
相對于類的成員,必須在構造對象以后才會分配內存空間,只能通過對象名訪問。而靜態成員在無需構造對象情況下,可以使用類名訪問。
全局變量和靜態變量的區別:
對于定義在函數外面的變量被成為全局變量(或者叫外部變量),它的作用域是整個工程,比如我在A.cpp中定義了一個全局變量 :int A;
那么如果我想在B.cpp中使用這個變量,我就可以在B.cpp中使用extern關鍵字來使用變量A :extern A;
靜態變量包括靜態全局變量和靜態局部變量
和全局變量相比,靜態全局變量的作用域是定義它的這個cpp文件,如果一個項目只有這一個cpp,那么在作用域來說,它與全局變量沒有區別,如果是多個cpp,在另一個cpp中使用extern也無濟于事。
而靜態局部變量只在定義它的函數里面起作用,與普通局部變量相比,當函數返回后,靜態局部變量并不會消失,而普通局部變量會消失。
靜態變量和全局變量的值在未初始化,都會被設定為0,而其他變量的值設定隨機。
3. 友元函數友元類
所謂友元函數,就是在類中,用friend關鍵字聲明一個函數,這個函數的聲明在類中,但不作為類的成員函數,雖然友元函數不屬于成員函數,卻可以訪問類中的成員,不論成員是public,pirvate還是protected。
對于友元函數,放在public和private,或者是protected,都是可以的。
class Animal { private: string name; friend void getName(); }; void getName() { //業務邏輯 }
1
2
3
4
5
6
7
8
9
10
11
為什么要引入友元函數:在實現類之間數據共享時,減少系統開銷,提高效率,具體來說:為了使其他類的成員函數直接訪問該類的私有變量,同時也破壞了類的封裝性,所以不到萬不得已,還是不要用友元函數。
因為是需要友元來共享數據,那么大多數情況,友元函數都是有參數的, 因為友元函數沒有this指針,則參數要有三種情況:
要訪問非static成員時,需要對象做參數;
要訪問static成員或全局變量時,則不需要對象做參數
如果做參數的對象是全局對象,則不需要對象做參數
至于友元類,也是一樣。
C++
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。