最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

剖析C++編程中friend關(guān)鍵字所修飾的友元函數(shù)和友元類

 更新時間:2016年01月21日 15:33:43   投稿:goldensun  
這篇文章主要介紹了剖析C++編程中friend關(guān)鍵字所修飾的友元函數(shù)和友元類,友元了以后在外部就可以訪問到正常情況下無法訪問到的私有屬性和方法,需要的朋友可以參考下

在某些情況下,為不是類成員的函數(shù)或單獨類中的所有函數(shù)授予成員級別的訪問權(quán)會更方便。僅類實現(xiàn)器可以聲明其友元。函數(shù)或類不能將其自身聲明為任何類的友元。在類聲明中,使用 friend 關(guān)鍵字和非成員函數(shù)名稱或其他類,以允許其訪問你的類的專用和受保護成員。
語法

  friend class-name;
friend function-declarator;

友元聲明
如果聲明以前未聲明的友元函數(shù),則該函數(shù)將被導出到封閉非類范圍。
友元聲明中聲明的函數(shù)被視為已使用 extern 關(guān)鍵字聲明。(有關(guān) extern 的詳細信息,請參閱靜態(tài)存儲類說明符。)
盡管具有全局范圍的函數(shù)可以在其原型之前聲明為友元函數(shù),但是成員函數(shù)在它們的完整類聲明出現(xiàn)前不能聲明為友元函數(shù)。以下代碼演示此失敗的原因:

class ForwardDeclared; // Class name is known.
class HasFriends
{
 friend int ForwardDeclared::IsAFriend(); // C2039 error expected
};

前面的示例將類名 ForwardDeclared 輸入到范圍中,但是完整的聲明(具體而言,聲明函數(shù) IsAFriend 的部分)是未知的。因此,friend 類中的 HasFriends 聲明會生成一個錯誤。
若要聲明兩個互為友元的類,則必須將整個第二個類指定為第一個類的友元。此限制的原因是該編譯器僅在聲明第二個類的位置有足夠的信息來聲明各個友元函數(shù)。
注意
盡管整個第二個類必須是第一個類的友元,但是可以選擇將第一個類中的哪些函數(shù)作為第二個類的友元。
友元函數(shù)
friend 函數(shù)是一個不為類成員的函數(shù),但它可以訪問類的私有和受保護的成員。友元函數(shù)不被視為類成員;它們是獲得了特殊訪問權(quán)限的普通外部函數(shù)。友元不在類的范圍內(nèi),除非它們是另一個類的成員,否則不會使用成員選擇運算符(. 和 –>)調(diào)用它們。 friend 函數(shù)由授予訪問權(quán)限的類聲明??蓪?friend 聲明放置在類聲明中的任何位置。它不受訪問控制關(guān)鍵字的影響。
以下示例顯示 Point 類和友元函數(shù) ChangePrivate。 friend 函數(shù)可以訪問其接受為參數(shù)的 Point 對象的私有數(shù)據(jù)成員。

// 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
}
作為友元的類成員
類成員函數(shù)可以聲明為其他類中的友元。請看下面的示例:
// 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

在前面的示例中,僅為函數(shù) A::Func1( B& ) 授予對類 B 的友元訪問權(quán)限。因此,訪問私有成員 _b 在類 Func1 的 A 中是正確的,但在 Func2 中是不正確的。
friend 類是其所有成員函數(shù)都是類的友元函數(shù)的類,即,其成員函數(shù)具有對類的私有成員和受保護成員訪問權(quán)限。假定類 friend 中的 B 聲明是:

friend class A;

在這種情況下,將為類 A 中所有成員函數(shù)授予對類 B 的友元訪問權(quán)限。以下代碼是友元類的示例:

// 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();
}

友元關(guān)系不是相互的,除非如此顯式指定。在上面的示例中,YourClass 的成員函數(shù)無法訪問 YourOtherClass 的私有成員。
托管類型不能具有任何友元函數(shù)、友元類或友元接口。
友元關(guān)系不能繼承,這意味著從 YourOtherClass 派生的類不能訪問 YourClass 的私有成員。友元關(guān)系不可傳遞,因此 YourOtherClass 的友元類無法訪問 YourClass 的私有成員。
下圖顯示了 4 個類聲明:Base、Derived、aFriend 和 anotherFriend。只有類 aFriend 具有對 Base 的私有成員(以及對 Base 可能已繼承的所有成員)的直接訪問權(quán)限。

2016121153215228.jpeg (552×192)

內(nèi)聯(lián)友元定義
可以在類聲明中定義友元函數(shù)。這些函數(shù)是內(nèi)聯(lián)函數(shù),類似于成員內(nèi)聯(lián)函數(shù),其行為就像它們在所有類成員顯示后但在類范圍關(guān)閉前(類聲明的結(jié)尾)被定義時的行為一樣。
類聲明中定義的友元函數(shù)不被認為在封閉類的范圍內(nèi);它們在文件范圍內(nèi)。

相關(guān)文章

  • Java C++ 題解leetcode1619刪除某些元素后數(shù)組均值

    Java C++ 題解leetcode1619刪除某些元素后數(shù)組均值

    這篇文章主要為大家介紹了Java C++ 題解leetcode1619刪除某些元素后數(shù)組均值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C++核心編程之內(nèi)存分區(qū)詳解

    C++核心編程之內(nèi)存分區(qū)詳解

    這篇文章主要為大家詳細介紹了C++核心編程之內(nèi)存分區(qū),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解

    數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之數(shù)組Array實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++面試八股文之什么是構(gòu)造函數(shù)

    C++面試八股文之什么是構(gòu)造函數(shù)

    構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對象,這篇文章主要為大家詳細介紹了C++中構(gòu)造函數(shù)的相關(guān)知識點,需要的可以參考一下
    2023-06-06
  • C++ vector模擬實現(xiàn)的代碼詳解

    C++ vector模擬實現(xiàn)的代碼詳解

    vector是表示可變大小數(shù)組的序列容器,就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元素,本質(zhì)講,vector使用動態(tài)分配數(shù)組來存儲它的元素,本文將給大家詳細介紹一下C++ vector模擬實現(xiàn),需要的朋友可以參考下
    2023-07-07
  • c語言string.h頭文件中所有函數(shù)示例詳解

    c語言string.h頭文件中所有函數(shù)示例詳解

    這篇文章詳細介紹了C語言標準庫中的字符串和內(nèi)存操作函數(shù),以str開頭的字符串處理函數(shù)和以mem開頭的內(nèi)存處理函數(shù),每種函數(shù)都有詳細的原型、功能描述和示例代碼,需要的朋友可以參考下
    2024-11-11
  • 求解旋轉(zhuǎn)數(shù)組的最小數(shù)字

    求解旋轉(zhuǎn)數(shù)組的最小數(shù)字

    這篇文章主要介紹了求解旋轉(zhuǎn)數(shù)組的最小數(shù)字的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++ 中消息隊列函數(shù)實例詳解

    C++ 中消息隊列函數(shù)實例詳解

    這篇文章主要介紹了C++ 中消息隊列函數(shù)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言編寫猜數(shù)游戲

    C語言編寫猜數(shù)游戲

    這篇文章主要為大家詳細介紹了C語言編寫猜數(shù)游戲,可以自定義猜數(shù)范圍和機會次數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解C++11 線程休眠函數(shù)

    詳解C++11 線程休眠函數(shù)

    這篇文章主要介紹了C++11 線程休眠函數(shù)的相關(guān)資料,幫助大家更好的理解和學習C++11,感興趣的朋友可以了解下
    2020-10-10

最新評論

平陆县| 自贡市| 伊宁市| 黑龙江省| 迁安市| 洞口县| 安康市| 潜山县| 江安县| 昆山市| 留坝县| 黎川县| 增城市| 余庆县| 翁牛特旗| 都昌县| 元谋县| 达拉特旗| 蛟河市| 扎鲁特旗| 赞皇县| 沿河| 裕民县| 楚雄市| 东兰县| 益阳市| 顺昌县| 含山县| 榆社县| 遵义县| 卫辉市| 苏尼特左旗| 沈阳市| 斗六市| 炎陵县| 九台市| 隆德县| 邹城市| 内丘县| 吴川市| 五常市|