C 友元函式訪問類的私有資料

2025-03-28 07:20:25 字數 1846 閱讀 7112

1樓:立刻就立刻

您好,看了**理論上是可以的,然後在機子上編寫了乙個測試**,就你上面提到的**,我的測試時通過的沒有遇到問題,**如下:

the test

#include

using namespace std ;

class test

private:

friend void setx(test &,int) ;

friend ostream & operator<<(ostream &,test &)

int x ;

public:

int getx()

void setx(test &t, int ival)= ival ;

ostream & operator<<(ostream &output, test &t)

output<

return x ;

#include""

int main()

test t ;

setx(t, 3) ;

cout<<

coutreturn 0 ;

測試下吧,可能跟你之前的**有關吧。

c++友元函式不能訪問私有成員是為什麼?

2樓:刺任芹

因為同樣的**在visual studio2008裡能正常編譯,但放到裡卻提示不能訪問類complex的私有資料成員。根據c++的標準特性,類的友元函式應該允許訪問類的私有資料。

當在裡過載《和》時就會出現這種問題,奇怪的是過載別的運算子(如++)時,同樣訪問了類的私有資料成員,卻沒有報錯。

友元函式是指某些雖然不是類成員卻能夠訪問類的所有成員的函式。類授予它的友元特別的訪問權。通常同乙個開發者會出於技術和非技術的原因,控制類的友元和成員函式(否則當你想更新你的類時,還要徵得其它部分的擁有者的同意)。

形式。friend 型別名 友元函式名(形參表);

然後在類體外對友元函式進行定義,定義的格式和普通函式相同,但可以通過物件作為引數直接訪問物件的私有成員。

說明如下:1)必須在類的說明中說明友元函式,說明時以關鍵字friend開頭,後跟友元函式的函式原型,友元函式的說明可以出現在類的任何地方,包括在private和public部分;

2)注意友元函式不是類的成員函式,所以友元函式的實現和普通函式一樣,在實現時不用"::"指示屬於哪個類,只有成員函式才使用"::"作用域符號;

3)友元函式不能直接訪問類的成員,只能訪問物件成員,4)友元函式可以訪問物件的私有成員,但普通函式不行;

5)呼叫友元函式時,在實際引數中需要指出要訪問的物件,6)類與類之間的友元關係不能繼承。

7)乙個類的成員函式也可以作為另乙個類的友元,但必須先定義這個類。

友元函式能不能訪問類中的私有資料成員

3樓:樂跑小子

1、 友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend。

2、 友元函式可以訪問類的靜態成員、私有成員和公有成員。

3、友元的作用在於提高程式的執行效率(即減少了型別檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。

4樓:濯山揭含蕊

可以訪問。。成員函式和友元函式具有同等的特權(100%

的)。主要的不同在於友元函式象f(x)這樣呼叫,而成員函式象。

這樣呼叫。因此,可以在成員函式(和友元函式(f(x))之間選擇的能力允許設計者選擇他所認為更具可讀性的語法來降低維護成本。

友元函式與類內部的成員函式有什麼不同

最根本的區別 友元函式沒有這個類的物件的this指標,只能通過顯式引數修改類的物件,類內部的成員函式有乙個這個類的物件的this指標作為隱式引數,因此成員搏賀雹虛擬函式需要以的形式呼叫,而基肆派友元函式需要以bar foo 的形式呼叫 友元的友元函式 友元函式是能夠訪問類中的私有成員的非成員函式。友元...

c的類成員函式如何訪問全域性變數

假如有個全域性變數int a,存放於myfile.h檔案中,則在類中用,需要新增 include myfile.h extern int a 即可 一般情況下,假如沒有區域性宣告變數,就會呼叫全域性變數,如果宣告瞭區域性變數,則,區域性變數會遮蔽全域性變數。除非你指定呼叫全域性變數,加上作用域操作符...

c類和函式的問題,c類别範本和函式模板的問題

template class mytmpclass template mytmpclass mytmpclass template void mytmpclass set information template void mytmpclass display int main mytmpclass...