• C++学习笔记(十六):友元


    问题的提出:

    我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开 销,而影响程式的运行效率。

    友元是一种定义在类外部的普通函数,但他需要在类体内进行说 明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是他能够访问类中的私有成员。友元的作用在于提高程式的运 行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。

    C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

    友元函数:
    既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

    友元成员函数:
    既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

    友元类:
    友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

    示例:

     1 using namespace std;
     2 
     3 class B;
     4 
     5 class A{
     6     private:
     7         int x;
     8     public:
     9         A();
    10         void display(B &);
    11 };
    12 
    13 class C;
    14 
    15 class B{
    16     private:
    17         int y;
    18         int z;
    19     public:
    20         B();
    21         B(int, int);
    22     friend void A::display(B &);//友元成员函数
    23     friend void display(B &);//友元函数
    24     friend class C;//友元类
    25 };
    26 
    27 class C{
    28     private:
    29         int sum;
    30         void calc(B &);
    31     public:
    32         C();
    33         void display(B &);
    34 };
    35 
    36 //必须在友元关系的类后进行定义
    37 void display(B &v)//友元函数
    38 {
    39     cout << v.y << " " << v.z << endl;
    40 }
    41 
    42 A::A()
    43 {
    44     this->x = 0;
    45 }
    46 
    47 void A::display(B &v)//友元成员函数
    48 {
    49     this->x = v.y + v.z;
    50     cout << this->x << endl;
    51 }
    52 
    53 B::B()
    54 {
    55     this->y = 0;
    56     this->z = 0;
    57 }
    58 
    59 B::B(int y, int z)
    60 {
    61     this->y = y;
    62     this->z = z;
    63 }
    64 
    65 C::C()
    66 {
    67     sum = 0;
    68 }
    69 
    70 void C::display(B &v)
    71 {
    72     this->calc(v);
    73     cout << sum << " = " << v.y << " + " << v.z << endl;
    74 }
    75 
    76 void C::calc(B &v)
    77 {
    78     sum = v.y + v.z;
    79 }
    80 
    81 int main()
    82 {
    83     A a;
    84     B b(2, 3);
    85     display(b);
    86     a.display(b);
    87     C c;
    88     c.display(b);
    89     
    90     return 0;
    91 }
  • 相关阅读:
    weui若干问题小结(排坑指南)
    Kafka3.1.0集群安装(KRaft模式)
    Kafka3.1.0集群搭建(使用自带zookeeper)
    微信小程序后台获取数据刷新页面
    微信小程序开发知识点汇总
    (打包)打包出错 Failed to execute goal org.apache.maven.plugins:mavensurefireplugin:2.18.1
    C++ noexcept关键字有时候会导致函数体变大
    微信小程序切换时回到顶部
    echarts图例legend中name和数值设置为不同的颜色
    DuckChat
  • 原文地址:https://www.cnblogs.com/hammerc/p/4032823.html
Copyright © 2020-2023  润新知