日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于友元的使用

發布時間:2025/3/21 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于友元的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.友元的背景:C++提供了三大訪問控制權限用于控制類外,類內,子類內對成員的訪問的控制.

2.友元就是一個類對某個對象授予所有的訪問控制權限

  • 例如MyClass有一個私有的成員變量m_nNum
  • 在main函數中是不能直接通過對象來訪問的. 但是通過友元授權,main也能直接通過對象來訪問到這個類的所有成員.
  • 3.友元能夠授予權限的對象:

  • 友元普通函數 : 將類的訪問權限全部授予一個普通的函數 class MyClass{int m_nNum;static int m_staticNum;// 使用friend關鍵字將某個普通函數的函數頭放在類內聲明// 這個普通函數就能成為本類友元普通函數.friend int main(); }; int MyClass::m_staticNum;int main(){MyClass obj;obj.m_nNum=0;// 成為友元之后可以訪問私有成員MyClass::m_staticNum=0; }

    ?

  • 友元類 : 將本類的訪問權限全部授予給另一個類(在另一個類的所有成員函數中都能直接訪問到授權類的所有成員)

    ?

    class MyClass{int m_nNum;static int m_staticNum;// 聲明一個友元類: friend class 類名;// 作用: 該類所有成員函數都能訪問本類的// 私有成員.friend class Class2; }; int MyClass::m_staticNum;class Class2{ public:void fun(MyClass& obj){// 聲明友元類之后, 就能在成員函數中// 去訪問MyClass類的私有變量obj.m_nNum = 0;} };

    ?

  • 友元成員函數 : 將本類的訪問權限全部授予給另一個類某個成員函數(只有被授權的成員函數能夠訪問所有成員,沒有被授權的成員函數訪問不了)
  • 互相引用的問題 : 在A類中使用了B類, B類又使用了A類. 類的聲明就無法正常聲明了. class MyClass2 { public:void fun1();void fun2(); };class MyClass1 {int m_nNum; public:// 聲明友元成員函數friend void MyClass2::fun1(); };void MyClass2::fun1() {MyClass1 obj;// 訪問私有成員變量obj.m_nNum = 0; } void MyClass2::fun2() {MyClass1 obj;// 訪問私有成員變量, 但fun2并沒有被聲明成友元成員函數. 因此訪問失敗.obj.m_nNum = 0; }


    ?

  • 如果是多個文件的處理方式:

    ?

    Test1.h文件#pragma once#include "Test2.h"class Test1{private :int nums;public:Test1();~Test1();friend void Test2::fun();}; Test2.h文件#pragma onceclass Test2{public:Test2();~Test2();void fun();}; Test2.cpp文件#include "Test2.h"#include "Test1.h"Test2::Test2(){}Test2::~Test2(){}void Test2::fun(){Test1 test;test.nums = 10;} //在Test2.h文件中不包含Test1.h的內容防止相互包含 //應該在Test2.cpp文件中進行包含Test1.h的內容 //解決兩個類相互包含的問題 Test2.h文件#pragma onceclass Test1;//這里前置聲明Test1是一個類class Test2 {private:Test1 *test;//這里使用Test1的指針,因為只聲明Test1是一個類,但是并沒有具體的定義,所以這里只能使用指針,而在Test.cpp文件中就應該引入完整的Test1類也就是Test1.h文件public:Test2();~Test2();void fun();}; Test2.cpp文件#include "Test2.h"Test2::Test2(){}Test2::~Test2(){}void Test2::fun(){// Test1 test;// test.nums = 10;} Test1.h文件#pragma once#include "Test2.h"//另一個類直接包含整個Test2.h文件class Test1{private :int nums;public:Test1();~Test1();friend void Test2::fun();};

    ?

  • 運算符重載有關-->轉至運算符重載
  • 總結

    以上是生活随笔為你收集整理的关于友元的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。