C++ 友元

朋友可访问自己的东西,大概就这么个意思。即某类的友元类可访问该类的所有变量以及函数,或友元函数可以访问该类的变量以及函数,在朋友眼中没有任何隐藏,可谓时赤裸相对,肝胆相照,生生挚友。

注意:记得前置声明,不然很容易报错说没有定义声明;

友元函数:

cpp 复制代码
// 【3】编写一个程序包含两个类,一个为Remotera类用来表示(万能)遥控器,一个为TV类用来表示电视机,要求遥控器能控制电视机,提供如下功能:
// ·电视机本身提供诸如setChannel(0、setVolume0等接口来修改频道和音量
// ·遥控器(万能)可控制电视机,但诸如开灯、降低空调温度等操作对电视机无效
#include <iostream>
#include <string.h>
using namespace std;

class TV;
class RemoteControl;

class RemoteControl
{
public:
    void setVolume(TV &tv, int volume); 
    void setChannel(TV &tv, int channel);
};

class TV
{
public:
    TV() {}
    void show()
    {
        cout << "TV volume=" << volume << endl;
        cout << "TV channel=" << channel << endl;
    }

private:
    friend void RemoteControl::setChannel(TV &tv, int channel); //友元函数
    friend void RemoteControl::setVolume(TV &tv, int volume);
    int volume;
    int channel;
};

void RemoteControl::setVolume(TV &tv, int volume)
{
    tv.volume = volume;
}

void RemoteControl::setChannel(TV &tv, int channel)
{
    tv.channel = channel;
    cout << "友元函数调用: "<< endl;
    tv.show();
}


int main(int argc, char const *argv[])
{
    TV tv;
    RemoteControl rc;
    rc.setVolume(tv, 10);
    rc.setChannel(tv, 10);
    tv.show();
    return 0;
}

友元类:

cpp 复制代码
// 练习:利用友元类的技术点,让两个类,互为友元,并访问对方的私有成员。遇到语法错误,思考如何解决?
#include <iostream>
#include <string.h>
using namespace std;

class A;
class B;

class A
{
public:
    A(int a)
    {
        this->a = a;
    }
    void show_a(B &b);
private:
    int a;
    friend class B;
};
class B
{
public:
    B(int b)
    {
        this->b = b;
    }
    void show_b(A &a);


private:
    int b;
    friend class A;
};

void B::show_b(A &a)
{
    a = 10;
    cout << "a=" << a.a << endl;
    cout << "b=" << b << endl;
}

void A::show_a(B &b)
{
    b = 20;
    cout << "a=" << a << endl;
    cout << "b=" << b.b << endl;
}

int main(int argc, char const *argv[])
{
    A a(10);
    B b(20);
    a.show_a(b);
    b.show_b(a);
    return 0;
}
相关推荐
LawrenceLan26 分钟前
Flutter 零基础入门(十五):继承、多态与面向对象三大特性
开发语言·前端·flutter·dart
zh_xuan36 分钟前
kotlin对象表达式
开发语言·kotlin
froginwe1143 分钟前
ECharts 旭日图:全面解析与应用指南
开发语言
SunkingYang1 小时前
QT如何读取csv文件
c++·qt·csv·读取文件
yaoxin5211231 小时前
292. Java Stream API - 使用构建器模式创建 Stream
java·开发语言
CoderCodingNo1 小时前
【GESP】C++六级考试大纲知识点梳理, (2) 哈夫曼树、完全二叉树与二叉排序树
开发语言·c++
水饺编程1 小时前
第4章,[标签 Win32] :获取设备环境句柄的第一个方法
c语言·c++·windows·visual studio
a努力。1 小时前
字节跳动Java面试被问:一致性哈希的虚拟节点和数据迁移
java·开发语言·分布式·算法·缓存·面试·哈希算法
老四啊laosi1 小时前
[C++初阶] 9. STL--string使用(二)
c++
文慧的科技江湖1 小时前
重卡的充电桩一般都是多少千瓦? - 慧知开源充电桩平台
java·开发语言·开源·充电桩开源平台·慧知重卡开源充电桩平台