C++中的友元函數(shù)friend

技術(shù)交流QQ群:1027579432,歡迎你的加入!

1.C++中的友元函數(shù)

  • 類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過(guò),但是友元函數(shù)并不是成員函數(shù)。友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類,在這種情況下,整個(gè)類及其所有成員都是友元。
  • 如果要聲明函數(shù)為一個(gè)類的友元,需要在類定義中該函數(shù)原型前使用關(guān)鍵字friend,如下所示:
        class Box{
        double width;  // 默認(rèn)是private
        public:
            double length;
            friend void printWidth(Box box);  // 友元函數(shù)聲明
            void setWidth(double wid);
        };
    
  • 聲明類 ClassTwo 的所有成員函數(shù)作為類 ClassOne 的友元,需要在類 ClassOne 的定義中放置如下聲明:
        friend class classTwo;  // 在classOne類中進(jìn)行此友元類的聲明?。?!
    
  • 完整友元函數(shù)的實(shí)例如下:
        #include "iostream"
    
        using namespace std;
    
    
        class Box{
            double width;  // 默認(rèn)是private
            public:
                double length;
                friend void printWidth(Box box);  // 友元函數(shù)聲明
                void setWidth(double wid);
        };
    
        // 成員函數(shù)的定義
        void Box::setWidth(double wid){
            width = wid;
        }
        // 友元函數(shù)的定義
        // 請(qǐng)注意:printWidth() 不是任何類的成員函數(shù)!!!
        void printWidth(Box box){
            cout << "Width of Box: " << box.width << endl;
        }
    
        int main(){
            Box box;
            // 使用成員函數(shù)設(shè)置寬度
            box.setWidth(10.0);
            // 使用友元函數(shù)輸出寬度
            printWidth(box); // 調(diào)用友元函數(shù)!
            cout << "-------------------------------------\n";
            return 0;
        }
    

2.友元函數(shù)的使用

  • 可以直接調(diào)用友元函數(shù),不需要通過(guò)對(duì)象或指針;此外,友元函數(shù)沒(méi)有this指針,則參數(shù)要有三種情況:
    • 要訪問(wèn)非static成員時(shí),需要對(duì)象做參數(shù);
    • 要訪問(wèn)static成員或全局變量時(shí),則不需要對(duì)象做參數(shù);
    • 如果做參數(shù)的對(duì)象是全局對(duì)象,則不需要對(duì)象做參數(shù).
        class INT{
            friend void Print(const INT& obj);  // 聲明友元函數(shù)
        };
        // 友元函數(shù)的定義
        void Print(const INT& obj){
            cout << "我是INT類的友元函數(shù),我驕傲!\n";
        }
        INT obj;
        Print(obj);  // 直接調(diào)用友元函數(shù),不需要使用對(duì)象或者指針!
    
  • 下面實(shí)例是友元類的使用,詳細(xì)見(jiàn)下面的實(shí)例:
        class Box{
            double width;  // 默認(rèn)是private
            public:
                double length;
                friend void printWidth(Box box);  // 友元函數(shù)聲明
                friend class BigBox;  // 友元類的聲明
                void setWidth(double wid);
        };
    
        // 成員函數(shù)的定義
        void Box::setWidth(double wid){
            width = wid;
        }
        // 友元函數(shù)的定義
        // 請(qǐng)注意:printWidth() 不是任何類的成員函數(shù)!!!
        void printWidth(Box box){
            /* 因?yàn)閜rintWidth()是Box的友元函數(shù),它可以直接訪問(wèn)該類的任何成員 */
            cout << "Width of Box: " << box.width << endl;
        }
    
        // 友元類的使用
        class BigBox{
            public:
                void Print(int width, Box &box){
                    // BigBox是Box類的友元類,它可以直接訪問(wèn)Box類的任何成員
                    box.setWidth(width);
                    cout << "Width of Box: " << box.width << endl;
                }
        };
    
        int main(){
            Box box;
            BigBox big;
            // 使用成員函數(shù)設(shè)置寬度
            box.setWidth(10.0);
            // 使用友元函數(shù)輸出寬度
            printWidth(box); // 調(diào)用友元函數(shù)!
            cout << "-------------------------------------\n";
            // 使用友元類中的方法設(shè)置寬度
            big.Print(20, box);
            return 0;
        }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容