文章目錄
- 1. this指標
- 2. 靜態成員
- 3. 友元函式友元類
1. this指標
在上篇講C++中類,物件,封裝,繼承(派生),多型的時候,this指標出現在成員函式中,并使用->成員提取符操作成員變數,
在 C++ 中,每一個物件都能通過 this 指標來訪問自己的地址,this 指標是所有成員函式的隱含引數,實際上成員函式默認第一個引數為T* const register this,this指標在成員函式的開始執行前構造的,在成員的執行結束后清除,
例如我們自定義一個print函式
class Animal
{
String name;
void print()
{
cout<<this->name;
}
}
但是在編譯器看來,它的原型是這樣的:
class Animal
{
String name;
void print(T* const register this)
{
cout<<this->name;
}
}
因此,在成員函式內部,它可以用來指向呼叫物件,并且只可以在成員函式中呼叫,對于全域函式,靜態函式,友元函式,都不能使用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;
}
當我輸出這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()
{
//業務邏輯
}
為什么要引入友元函式:在實作類之間資料共享時,減少系統開銷,提高效率,具體來說:為了使其他類的成員函式直接訪問該類的私有變數,同時也破壞了類的封裝性,所以不到萬不得已,還是不要用友元函式,
因為是需要友元來共享資料,那么大多數情況,友元函式都是有引數的, 因為友元函式沒有this指標,則引數要有三種情況:
要訪問非static成員時,需要物件做引數;
要訪問static成員或全域變數時,則不需要物件做引數
如果做引數的物件是全域物件,則不需要物件做引數
至于友元類,也是一樣,
CSDN認證博客專家
Qt
C
C++
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/262597.html
標籤:其他
