C++ 面向对象编程:友元、

server/2024/12/22 17:47:53/

友元:让一个类或函数,能够访问另一个类的私有成员。友元关键字为friend。

友元有三种:第一种是全局函数作为友元,第二种是类作为友元,第三种是成员函数作为友元

第一种是全局函数作为友元,见以下代码:

#include<iostream>
#include<string>
using namespace std;

class People {
    friend void getfriendmsg(People* p);
public:
    People() {
        msg1 = "aa";
        msg2 = "bb";
    }
public:
    string msg2;
private:
    string msg1;
};

void getfriendmsg(People *p) {
    cout << p->msg2 << endl;
    cout << p->msg1 << endl;
}

int main() {
    People p;
    return 0;
}

第二种是类作为友元,让另一个类去访问类的私有变量,可见以下代码:

#include<iostream>
#include<string>
using namespace std;

class People;

class People1 {
public:
    People1() {

    }
    void getmsg(People* p);
};
class People {
    friend class People1;
public:
    People() {
        msg1 = "aa";
        msg2 = "bb";
    }
public:
    string msg2;
private:
    string msg1;
};

void People1::getmsg(People* p) {
    cout << p->msg2 << endl;
    cout << p->msg1 << endl;
}

int main() {
    People p;
    People1 p1;
    p1.getmsg(&p);
    return 0;
}

第三种是成员函数作为友元

#include<iostream>
#include<string>
using namespace std;

class People;

class People1 {
public:
    People1() {

    }
    void getmsg2(People* p);
    void getmsg12(People* p);
};
class People {
    friend void People1::getmsg12(People* p);
public:
    People() {
        msg1 = "aa";
        msg2 = "bb";
    }
public:
    string msg2;
private:
    string msg1;
};

void People1::getmsg12(People* p) {
    cout << p->msg2 << endl;
    cout << p->msg1 << endl;
}

void People1::getmsg2(People* p) {
    cout << p->msg2 << endl;
}

int main() {
    People p;
    People1 p1;
    p1.getmsg2(&p);
    p1.getmsg12(&p);
    return 0;
}


http://www.ppmy.cn/server/152283.html

相关文章

高并发架构设计:从 Java Callable 到 CompletableFuture 的进阶修炼

前言 在现代的分布式系统中&#xff0c;高并发性能是一个决定系统能否成功的关键因素。而 Java 作为主流的后端开发语言&#xff0c;也提供了许多强大的工具来帮助我们处理并发任务。今天&#xff0c;我们将通过两个关键工具来讲解高并发架构设计的技巧&#xff1a;Callable 和…

vue3中的ref与reactive

摘要 在vue3直接定义变量不是响应式数据 在vue3中定义变量更改变量页面是显示不出来的 在按钮中绑定一个函数&#xff0c;当我点击它的时候发生改变str值 点击前 点击后 点击后控制台显示更改数据&#xff0c;而页面中不显示数据&#xff0c;这就是vue3没触发响应式 使用re…

mac 安装graalvm

Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…

Leetcode 串联所有单词的子串

算法思想&#xff08;中文解释&#xff09; 这道题目要求我们在字符串 s 中找到所有子串&#xff0c;这些子串是字符串数组 words 中所有单词的串联&#xff0c;并且每个单词只能使用一次&#xff0c;且顺序可以任意。下面是代码的算法思想&#xff1a; 1. 核心思路 分解问题…

三、使用langchain搭建RAG:金融问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…

信息安全管理与评估赛题第4套

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题四 模块一 网络平台搭建与设备安全防护 1 赛项时间 共计180分钟。 2 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务2…

视频点播系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

uni-app开发商品分类页面实现

目录 一:功能概述 二:功能实现 一:功能概述 这里商品分类按照常规的分类页面样式设计,左侧为一级分类,右侧为二级分类。在左侧切换不同的一级分类可以修改右侧的二级分类数据。右侧的展现方式是最上面显示对应的一级分类logo图片,下面展示二级分类的logo和名称。 二:…