C 類的this指標,靜態成員,友元函式友元類

2021-10-19 11:19:19 字數 2309 閱讀 4942

在上篇講c++中類,物件,封裝,繼承(派生),多型的時候,this指標出現在成員函式中,並使用->成員提取符操作成員變數。

在 c++ 中,每乙個物件都能通過 this 指標來訪問自己的位址,this 指標是所有成員函式的隱含引數,實際上成員函式預設第乙個引數為t* const register this,this指標在成員函式的開始執行前構造的,在成員的執行結束後清除。

例如我們自定義乙個print函式

class

animal

}

但是在編譯器看來,它的原型是這樣的:

class

animal

}

因此,在成員函式內部,它可以用來指向呼叫物件,並且只可以在成員函式中呼叫,對於全域性函式,靜態函式,友元函式,都不能使用this指標。

乙個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。

在變數或者函式前面加上關鍵字:static,它就變了乙個靜態變數或者靜態函式,當static出現在類中被修飾成員中,被成為靜態成員。

class

animal

animal an[10]

;for

(int i =

0; i <

10; 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,而其他變數的值設定隨機。

所謂友元函式,就是在類中,用friend關鍵字宣告乙個函式,這個函式的宣告在類中,但不作為類的成員函式,雖然友元函式不屬於成員函式,卻可以訪問類中的成員,不論成員是public,pirvate還是protected。

對於友元函式,放在public和private,或者是protected,都是可以的。

class

animal

;void

getname()

為什麼要引入友元函式:在實現類之間資料共享時,減少系統開銷,提高效率,具體來說:為了使其他類的成員函式直接訪問該類的私有變數,同時也破壞了類的封裝性,所以不到萬不得已,還是不要用友元函式。

因為是需要友元來共享資料,那麼大多數情況,友元函式都是有引數的, 因為友元函式沒有this指標,則引數要有三種情況:

要訪問非static成員時,需要物件做引數;

要訪問static成員或全域性變數時,則不需要物件做引數

如果做引數的物件是全域性物件,則不需要物件做引數

至於友元類,也是一樣。

C 友元與靜態成員

c 中,類外的成員不能訪問類內的私有和保護型別成員。而友元函式可以不受訪問限制訪問類的任何成員。友元函式雖然可以在類內進行宣告,但是友元函式不是成員函式,因此沒有this指標。舉例說明 class clock clock clock int h,int m,int s void show clock...

C 友元函式 友元類 友元成員函式

眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...

友元(友元函式 友元類 類成員函式的友元)

friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...