友元

    技术2022-05-18  42

         类是具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员。程序中其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员。但是数据成员都定义为公有的,又破坏了隐藏的特性。

         在某些情况下,特别是对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查都需要时间开销。影响程序的运行效率。

    提出了友元的概念:

    友元是一种定义在类外部的普通函数,需要在类体内进行声明。

    friend 函数返回类型 函数名();

    友元函数不是成员函数,因此定义时无需“::”但可以通过对象作为参数直接访问对象的私有成员.

    友元函数说明如下

      1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;

      2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;

      3)友元函数不能直接访问类的成员,只能访问对象成员,

      4)友元函数可以访问对象的私有成员,但普通函数不行;

      5)调用友元函数时,在实际参数中需要指出要访问的对象,

      6)类与类之间的友元关系不能继承。

    友元函数实例

    class A {public: A() {  a=0;  b=1; } private: int a; int b; friend void print(A &hh) { cout<<hh.a<<endl; } 

    };

    int main(){

    A h;

    print(h); return 0;}

     

    友元:

    友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。

    友元破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

    以下给出友元类的定义:

          例如,以下语句说明类B是类A的友元类:class A {public: A() {  a=0;  b=1; } friend class B;private:  int a; int b;

    };class B{public: void print(A &hh) {  cout<<hh.a<<endl;   }};

    int main(){ A h; B b; b.print(h); return 0;}    经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

     

     

     


    最新回复(0)