分析C++編程中friend症結字所潤飾的友元函數和友元類。本站提示廣大學習愛好者:(分析C++編程中friend症結字所潤飾的友元函數和友元類)文章只能為提供參考,不一定能成為您想要的結果。以下是分析C++編程中friend症結字所潤飾的友元函數和友元類正文
在某些情形下,為不是類成員的函數或零丁類中的一切函數授與成員級其余拜訪權會更便利。僅類完成器可以聲明其友元。函數或類不克不及將其本身聲明為任何類的友元。在類聲明中,應用 friend 症結字和非成員函數稱號或其他類,以許可其拜訪你的類的公用和受掩護成員。
語法
friend class-name; friend function-declarator;
友元聲明
假如聲明之前未聲明的友元函數,則該函數將被導出到關閉非類規模。
友元聲明中聲明的函數被視為已應用 extern 症結字聲明。(有關 extern 的具體信息,請參閱靜態存儲類解釋符。)
雖然具有全局規模的函數可以在其原型之前聲明為友元函數,然則成員函數在它們的完全類聲明湧現前不克不及聲明為友元函數。以下代碼演示此掉敗的緣由:
class ForwardDeclared; // Class name is known. class HasFriends { friend int ForwardDeclared::IsAFriend(); // C2039 error expected };
後面的示例將類名 ForwardDeclared 輸出到規模中,然則完全的聲明(詳細而言,聲明函數 IsAFriend 的部門)是未知的。是以,friend 類中的 HasFriends 聲明會生成一個毛病。
若要聲明兩個互為友元的類,則必需將全部第二個類指定為第一個類的友元。此限制的緣由是該編譯器僅在聲明第二個類的地位有足夠的信息來聲明各個友元函數。
留意
雖然全部第二個類必需是第一個類的友元,然則可以選擇將第一個類中的哪些函數作為第二個類的友元。
友元函數
friend 函數是一個不為類成員的函數,但它可以拜訪類的公有和受掩護的成員。友元函數不被視為類成員;它們是取得了特別拜訪權限的通俗內部函數。友元不在類的規模內,除非它們是另外一個類的成員,不然不會應用成員選擇運算符(. 和 –>)挪用它們。 friend 函數由授與拜訪權限的類聲明。可將 friend 聲明放置在類聲明中的任何地位。它不受拜訪掌握症結字的影響。
以下示例顯示 Point 類和友元函數 ChangePrivate。 friend 函數可以拜訪其接收為參數的 Point 對象的公有數據成員。
// friend_functions.cpp // compile with: /EHsc #include <iostream> using namespace std; class Point { friend void ChangePrivate( Point & ); public: Point( void ) : m_i(0) {} void PrintPrivate( void ){cout << m_i << endl; } private: int m_i; }; void ChangePrivate ( Point &i ) { i.m_i++; } int main() { Point sPoint; sPoint.PrintPrivate(); ChangePrivate(sPoint); sPoint.PrintPrivate(); // Output: 0 1 }作為友元的類成員
// classes_as_friends1.cpp // compile with: /c class B; class A { public: int Func1( B& b ); private: int Func2( B& b ); }; class B { private: int _b; // A::Func1 is a friend function to class B // so A::Func1 has access to all members of B friend int A::Func1( B& ); }; int A::Func1( B& b ) { return b._b; } // OK int A::Func2( B& b ) { return b._b; } // C2248
在後面的示例中,僅為函數 A::Func1( B& ) 授與對類 B 的友元拜訪權限。是以,拜訪公有成員 _b 在類 Func1 的 A 中是准確的,但在 Func2 中是不准確的。
friend 類是其一切成員函數都是類的友元函數的類,即,其成員函數具有對類的公有成員和受掩護成員拜訪權限。假定類 friend 中的 B 聲明是:
friend class A;
在這類情形下,將為類 A 中一切成員函數授與對類 B 的友元拜訪權限。以下代碼是友元類的示例:
// classes_as_friends2.cpp // compile with: /EHsc #include <iostream> using namespace std; class YourClass { friend class YourOtherClass; // Declare a friend class public: YourClass() : topSecret(0){} void printMember() { cout << topSecret << endl; } private: int topSecret; }; class YourOtherClass { public: void change( YourClass& yc, int x ){yc.topSecret = x;} }; int main() { YourClass yc1; YourOtherClass yoc1; yc1.printMember(); yoc1.change( yc1, 5 ); yc1.printMember(); }
友元關系不是互相的,除非如斯顯式指定。在下面的示例中,YourClass 的成員函數沒法拜訪 YourOtherClass 的公有成員。
托管類型不克不及具有任何友元函數、友元類或友元接口。
友元關系不克不及繼續,這意味著從 YourOtherClass 派生的類不克不及拜訪 YourClass 的公有成員。友元關系弗成傳遞,是以 YourOtherClass 的友元類沒法拜訪 YourClass 的公有成員。
下圖顯示了 4 個類聲明:Base、Derived、aFriend 和 anotherFriend。只要類 aFriend 具有對 Base 的公有成員(和對 Base 能夠已繼續的一切成員)的直接拜訪權限。
內聯友元界說
可以在類聲明中界說友元函數。這些函數是內聯函數,相似於成員內聯函數,其行動就像它們在一切類成員顯示後但在類規模封閉前(類聲明的開頭)被界說時的行動一樣。
類聲明中界說的友元函數不被以為在關閉類的規模內;它們在文件規模內。