如果類a是類b的友元類,則,類a的成員函式都為類b的友元函式
class b;
class a ;
class b
};class a
};int main()
輸出:
3
分析:a為b的友元類,所以a的所有方法(當然,這裡的所有是指那些引數為類b的物件,否則沒有意義)都可以訪問b物件的私有成員。
可以將另乙個類中的特定成員函式宣告為乙個類的友元
將類b中的成員函式宣告為類a的友元
class b;
class a ;
class b;
void a::f(b &obj)
注意的點(順序很重要):
在b中,要宣告friend void a::f(b &ojb),在這之前,必須要先宣告類a;如果在不再類b前宣告類a,則編譯器會報錯「a不是類或命名空間名稱」。宣告友元之前,一定要先宣告友元成員函式所在的類
那如果這樣寫呢?首先說一下,這樣寫是錯的
class a;
class b;
class a ;
void a::f(b &obj)
編譯器會在friend void a::f(b &obj)報另乙個錯 「使用了未定義型別a」,這說明,類a的宣告一定要放在類b之前。
好了,返回到上面的例子中 。
分析完這裡,還要注意,那就是在類a宣告之前,要有乙個前向宣告class b,否則,編譯器無法識別識別符號b(類a的成員函式的引數為類b的引用,如果沒有前向宣告,目前為止,還不知道b是什麼),所以要先告訴編譯器,b是乙個類,只不過還沒有定義這個類。
最後一點,類b的友元成員函式(a::f())的定義必須放在類b的宣告之後,a::f()要訪問類b的成員,因此要放在類a的定義之後,否則就訪問了乙個未定義的類,這也是不允許的。
class b;
class a ;
class b
};void a::f(b &obj)
int main()
class a;
class b;
class a ;
這裡的前向宣告不寫不會影響執行,但會有警告。
class a;
class b
void showa(a &obj);
};class a
void showb(b &obj);
};void a::showb(b &obj)
void b::showa(a &obj)
int main()
輸出:
1
3
注意的點:
b::f()的定義要放在類a的定義之後,否則就使用了為定義的類
如果要宣告乙個成員函式為友元,那麼一定要先定義這個成員函式所在的類,這樣的話,類a要在類b之前,類b又要在類a之前,所以,這樣的情況是不能實現的
C 友元函式 友元類 友元成員函式
眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...
友元函式 友元類 友元成員
友元 友元函式 友元類和友元成員函式 c 有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以fr...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...