IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 初步探究C++友元 -> 正文阅读

[C++知识库]初步探究C++友元

水平:看的 C++primer 5目前只把类的基本东西学了
越往后看越觉得类的结构(主要是几个类之间互相牵扯)复杂,就重新复习和整理了一下友元部分。
书上的话不是特别直接,为了让结构更清晰,直接给图+表格,再给个对应的类结构代码。

图解

在这里插入图片描述

表格

在这里插入图片描述

代码

main.cpp

在这里插入图片描述
main函数统一都是这样的结构,只包个类头文件。

表格中第一种

#include <string>
//最普通的友元:非成员函数,想要访问类private成员时
class A
{
        friend void fun(A a);
public:
private:
        std::string data = "TEST";
};
void fun(A a);
void fun(A a)
{
        std::cout << a.data;

        return;
}
~    

表格中第二种

好像没什么用

#include <string>
//第2种友元:当一个类指定  _已经定义过的类_  为友元
class B
{
public:
        void fun(){ std::cout << "class B"; }
        //这种情况还没有定义类A,所以不能访问A
private:
};
class A
{
        friend class B;
public:
private:
        std::string data = "TEST";
};

表格中第三种

这个和刚刚的对比起来看会更清晰

#include <string>
//第2种友元:当一个类指定  _已经定义过的类_  为友元
//目的:一个类想要访问之前类的private成员
//注意,这里在main中调用std::cout << b.a.data;会失败,使用b.fun()才能成功访问

/*
class B
{
public:
        void fun(){ std::cout << "class B"; }
        //这种情况还没有定义类A,所以不能访问A
private:
};
*/
class A
{
        friend class B;
public:
private:
        std::string data = "TEST";
};
class B
{
public:
        A a;
        void fun(){ std::cout << a.data; }
        //这种情况已经定义了类A,可以访问和使用类A
private:
};

表格中第四种

好像没什么用

class A
{
public:
        void func_a() { return; }
private:
};

class B
{
public:
        friend void A::func_a();
private:
        int num = 999;
};

表格中第五种

这个就是最复杂那种了,记住“前置声明(后定义类的前向声明),后置定义(前定义类的成员函数的定义)” 就可以了。

#include <string>
//第4种友元:当“一个类”指定  _已经定义过的类_  的成员函数  为友元函数
//且该友元函数要访问 这“一个类”的成员时。
//关键在于理解类的声明的作用、作用范围。
//类的声明:只有前向声明时的类的作用:
//1.只能定义其指针或引用类型
//2.可以声明函数时(但是不能定义)作为参数或者返回类型。
class B;
class A
{
public:
        void fun_a(B b);
private:
};

class B
{
public:
        friend void A::fun_a(B b);
private:
        int num = 999;
};

void A::fun_a(B b)
{
        std::cout << b.num;
}

反例就不举了,只要超出表格给的位置限制就是反例。

后面还有类的机制没学,等学得更多了就会回来更。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 17:19:59  更:2021-08-03 17:20:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 16:26:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码