• <td id="46i6g"><rt id="46i6g"></rt></td>
    <td id="46i6g"><kbd id="46i6g"></kbd></td>
  • <xmp id="46i6g"><option id="46i6g"></option><option id="46i6g"><option id="46i6g"></option></option>
  • <td id="46i6g"></td>
    發布時間:2020-09-29 09:32 原文鏈接: C++之友元的學習總結

    一、友元的概念:

    1、什么是友元?

    友元是c++中的一種關系

    友元關系發生在函數與類之間或者類與類之間

    友元關系是單項的,不能傳遞

    2、友元的用法:

    在類中以friend關鍵字聲明友元

    類的友元可以是其它類或者具體函數

    友元不是類的一部分

    友元不受類中訪問級別的限制

    友元可以直接訪問具體類的所有成員

    3、友元的語法:

    在類中使用friend 關鍵字對函數或者類進行聲明:

    class Test

        double x;
        double y;
        friend void func(Test& t);
    };
    void func(Test& t)

    注意:func() 全局函數是 Test 類的友元,func() 可以訪問Test 類的所有成員,但是 func() 不是 Test 的成員函數。

    示例代碼:

    #include <stdio.h>
    #include <math.h>
    class Test

       double x;
       double y;
    public:
       Test(double x,double y)
       {
          this->x=x;
          this->y=y;
       }
       double getX()
       {
          return x;
       }
       double getY()
       {
          return y;
        }
       friend double func(Test& t1,Test& t2);
    };
    double func(Test& t1,Test& t2)

          double ret =0;
          ret = (t2.y-t1.y)*(t2.y-t1.y)+(t2.x-t1.x)*(t2.x-t1.x);
           ret = sqrt(ret);
        return ret;

    int main()

       Test t1(1,2);
       Test t2(10,20);
       printf("t1(%f,%f)",t1.getX(),t1.getY());
       printf("t2(%f,%f)",t2.getX(),t2.getY());
       printf("(t1,t2)=%f",func(t1,t2));
       
       return 0;

    輸出結果:

    root@txp-virtual-machine:/home/txp/add# g++ test.cpp
    root@txp-virtual-machine:/home/txp/add# ./a.out
    t1(1.000000,2.000000)
    t2(10.000000,20.000000)
    (t1,t2)=20.124612

    4、友元的尷尬:

    友元是為了兼顧c語言的高效而誕生的

    友元直接破壞了面向對象的封裝性

    友元在實際開發產品中的高效是得不償失的

    友元在軟件工程中已經慢慢被遺棄了

    5、注意事項:

    友元關系不具備傳遞性

    類的友元可以是其它類的成員函數

    類的友元可以是某個完整的類

    所有的成員函數都是友元

    代碼測試:

    #include <stdio.h>
    class ClassC

       const char* n;
    public:
       ClassC(const char* n)
       {
           this->n = n;
       }
       
       friend class ClassB;
    };
    class ClassB

       const char* n;
    public:
       ClassB(const char* n)
       {
           this->n = n;
       }
       
       void getClassCName(ClassC& c)
       {
           printf("c.n = %s", c.n);
       }
       
       friend class ClassA;
    };
    class ClassA

       const char* n;
    public:
       ClassA(const char* n)
       {
           this->n = n;
       }
       
       void getClassBName(ClassB& b)
       {
           printf("b.n = %s", b.n);
       }
       /*
       void getClassCName(ClassC& c)
       {
           printf("c.n = %s", c.n);
       }
       */
    };
    int main()

       ClassA A("A");
       ClassB B("B");
       ClassC C("C");
       
       A.getClassBName(B);
       B.getClassCName(C);
       
       return 0;

    輸出結果:

    root@txp-virtual-machine:/home/txp/add# ./a.out
    b.n = B
    c.n = C

    如果把上面屏蔽的那部分代碼打開,編譯就會報錯(因為友元沒有傳遞性哦):

    root@txp-virtual-machine:/home/txp/add# g++ test.cpp
    test.cpp: In member function ‘void ClassA::getClassCName(ClassC&)’:
    test.cpp:5:17: error: ‘const char* ClassC::n’ is private
        const char* n;
                    ^
    test.cpp:48:32: error: within this context
            printf("c.n = %s", c.n);
                                   ^

    6、小結:

    友元是為了兼顧c語言的高效而誕生的

    友元直接破壞了面向對象的封裝性

    友元關系不具備傳遞性

    類的友元可以是其它類的成員函數

    類的友元可以是某個完成的類


  • <td id="46i6g"><rt id="46i6g"></rt></td>
    <td id="46i6g"><kbd id="46i6g"></kbd></td>
  • <xmp id="46i6g"><option id="46i6g"></option><option id="46i6g"><option id="46i6g"></option></option>
  • <td id="46i6g"></td>
    亚洲日本va中文字幕久久道具