C++学习笔记(十一)------has_a和use_a关系

文章目录

前言

一、has_a关系

        1.1 has_a概念

        1.2 has_a中构造和析构的顺序

        1.3 has_a对象的内存情况

二、use_a关系(友元关系)

1.友元函数:

2.友元类

3 使用多文件编程的方式重新编辑上述代码

总结


前言

         随着技术的革新,出现各种各样的编程语言,C++就是其中之一,作为最受欢迎的编程语言之一,C++带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容,可以直面系统底层API,SDK,另一方面提供了很多范式,足够的抽象能力,面向对象,操作符重载,模板等。

        之前的学习笔记都是从微观部分去学习C++的相关知识,本篇开始带领大家进入宏观部分进一步的学习C++的相关知识,本篇的主要内容包含has_a关系、use_a关系。


提示:以下是本篇文章正文内容,下面案例可供参考

一、has_a关系

        has_a关系是一种包含关系

        1.1 has_a概念

                has_a就是一个类型,有其它多个类型的属性共同组合而成的类型,形成了一个类与类的包含关系

        1.2 has_a中构造和析构的顺序

                构造顺序:从内向外,按照声明的顺序依次构造

                析构顺序:从外向内,按照生构造顺序的逆序依次构造

举个例子:(定义三个类,分别是房间、桌子、椅子,通过运行查看构造和析构的顺序,代码如下)

#include <iostream>
#include <string>using namespace std;
class Desk
{
public:Desk(){cout << "桌子构造" << endl;}~Desk(){cout << "桌子析构" << endl;}
};
class Chair
{
public:Chair(){cout << "椅子构造" << endl;}~Chair(){cout << "椅子析构" << endl;}
};
class Room
{
private:Desk _desk[3];Chair _chair[3];
public:Room(){cout << "房间构造" << endl;}~Room(){cout << "房间析构" << endl;}
};int main()
{Room room;return 0;
}

结果如下图所示:

1.3 has_a对象的内存情况

        出现上述的构造顺序和析构顺序,是因为has_a对象的内存情况,为了更加直观的看出内存的情况,画图如下:

        

二、use_a关系(友元关系)

        友元关系是一种描述类与函数,类与类之间的一种亲密关系。

1.友元函数:

        友元函数:在类中使用friend关键声明一个类外的函数为本类的友元函数.

        友元函数的特性是:当友元函数中有相应的类型的对象时,不受访问权限的影响。

举个例子(代码如下):

        意思是,定义了一个女生的类,一般情况下女生的年龄都是秘密,所以设置私有权限,访问不到,此时我们设计一个友元函数,就可以通过友元函数绕过权限问题直接访问年龄。

#include <iostream>
using namespace std;
class Gril
{
private:int age;public:Gril(int age){this->age = age;}//友元函数:friend void nianLing(Gril&); 
};                                     void nianLing(Gril& gril)
{cout << gril.age << endl;
}int main()
{Gril xiaomei(18);nianLing(xiaomei);return 0;
}

2.友元类

        友元类:两个类之间的一种亲密关系。

        友元类的使用方法:在类中使用friend关键字友元一个类型 friend class xxx;

举个例子:

#include <iostream>using namespace std;class Boyfriend
{
private:string name;
public:Boyfriend(string name){this->name = name;}void love_grilfrend(){cout << "爱他的女朋友" << endl;}friend class Grilfriend;
};class Grilfriend
{
private:string name;
public:Grilfriend(string name){this->name = name;}void love_boyfriend(){cout << "爱她的男朋友" << endl;}void love_eachother(Boyfriend& boyfriend){cout << boyfriend.name << "和" << this->name << "深爱着彼此" <<endl;}
};int main()
{Boyfriend boyfriend("xiaobai");Grilfriend grilfriend("saodiseng");grilfriend.love_eachother(boyfriend);return 0;
}

3 使用多文件编程的方式重新编辑上述代码

boyfriend.h

#ifndef BOYFRIEND_H
#define BOYFRIEND_H
#include <iostream>
#include <string>
using namespace std;
class Grilfriend;
class Boyfriend
{
private:string name;
public:Boyfriend(string name);void love_grilfriend(Grilfriend& grilfriend);friend class Grilfriend;
};#endif // BOYFRIEND_H

grilfrend.h

#ifndef GRILFRIEND_H
#define GRILFRIEND_H
#include <iostream>
#include <string>
using namespace std;
class Boyfriend;class Grilfriend
{
private:string name;
public:Grilfriend(string name);void love_boyfriend(Boyfriend& boyfriend);friend class Boyfriend;
};#endif // GRILFRIEND_H

 boyfriend.cpp

#include "boyfriend.h"
#include "grilfriend.h"
Boyfriend::Boyfriend(string name)
{this->name = name;
}
void Boyfriend::love_grilfriend(Grilfriend &grilfriend)
{cout << this->name << "爱他的女朋友" << grilfriend.name << endl;
}

  grilfriend.cpp

#include "grilfriend.h"
#include "boyfriend.h"
Grilfriend::Grilfriend(string name)
{this->name = name;
}
void Grilfriend::love_boyfriend(Boyfriend& boyfriend)
{cout << this->name << "爱她的男朋友" << boyfriend.name << endl;
}

main.cpp 

#include <iostream>
#include <boyfriend.h>
#include <grilfriend.h>
using namespace std;int main()
{Boyfriend boyfriend("xiaobai");Grilfriend grilfriend("saodiseng");boyfriend.love_grilfriend(grilfriend);grilfriend.love_boyfriend(boyfriend);return 0;
}

总结


        以上就是今天要整理的全部内容,本文简单的介绍了has_a和use_a的使用方法,并且举了几个小例子进行了说明,希望对大家有所帮助,如果内容中有任何的错误的地方还请指出,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/267865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

到底什么是DevOps

DevOps不是一组工具&#xff0c;也不是一个特定的岗位。在我看来DevOps更像是一种软件开发文化&#xff0c;一种实现快速交付能力的手段。 DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理&#xff0c;从而更快、更频繁地交付更稳定的…

高通平台开发系列讲解(USB篇)MBIM 调试记录

文章目录 一、MBIM网卡显示二、未插入SIM卡情况显示三、SIM 无服务四、正常五、抓取QXDM log 分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍MBIM网卡调试过程的记录。 一、MBIM网卡显示 若显示黄标,则检查mbimd进程是否正常,mbim驱动是否正常。 二…

Http模块

Http模块 1.创建http服务 //导入http模块 const http require(http)//创建服务对象 const server http.createServer((request,response)>{response.end(Hello HTTP Server) })// 监听端口&#xff0c;启动服务 server.listen(9000,()>{console.log(服务已启动....);…

class076 区间dp-上【算法】

class076 区间dp-上【算法】 算法讲解076【必备】区间dp-上 code1 1312. 让字符串成为回文串的最少插入次数 // 让字符串成为回文串的最少插入次数 // 给你一个字符串 s // 每一次操作你都可以在字符串的任意位置插入任意字符 // 请你返回让s成为回文串的最少操作次数 // 测试…

深度学习 Day11——T11优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

单位的网络能监控微信聊天记录吗

有人在后台咨询&#xff0c;单位的网络能监控微信聊天记录吗 先来回答这个问题&#xff1a; 是的&#xff0c;公司网络在特定情况下可以监控到微信聊天记录。 1&#xff0c;公司可能会通过网络监控软件来监控员工的网络活动。比如说我们经常使用的&#xff0c;域之盾软件&…

scala表达式

1.8 表达式&#xff08;重点&#xff09; # 语句(statement)&#xff1a;一段可执行的代码# 表达式(expression)&#xff1a;一段可以被求值的代码&#xff0c;在Scala中一切都是表达式 - 表达式一般是一个语句块&#xff0c;可包含一条或者多条语句&#xff0c;多条语句使用“…

基于SSM框架的在线投票系统

基于SSM框架的在线投票系统 文章目录 基于SSM框架的在线投票系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 随着科技的不断发展&#xff0c;人们对于民主参与的需求也越来越高。在线投票系统应运而生&#xff0c;为人们提供了便捷、高效的投票…

ImmunityCanvas7.26安装详细教程

ImmunityCanvas7.26 大家想必都已经知道了Immunity Canvas7.26武器于2021年3月2日泄露了吧那我就废话不多说了。 很多人已经有了这款工具不得不说这工具很nice如果要买的话一年的话3万美金我的天我穷了。。 简单介绍 Immunity Canvas是美国ImmunitySec出品的安全漏洞检测工具…

[渗透测试学习] CozyHosting - HackTheBox

文章目录 信息搜集 信息搜集 nmap扫描一下&#xff0c;发现存在80端口和22端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.230直接访问80端口发现有跳转 那么我们将ip添加到hosts里面&#xff0c;成功访问 观察发现是企业网站&#xff0c;扫描一下没有子域名 那么就扫…

Mybatis之自定义映射resultMap

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

上海轴承展|2024年第十届SIA上海国际轴承展览会→

2024年7月24-26日&#xff0c;上海国家会展中心&#xff08;虹桥&#xff09;举办的SIA2024上海国际轴承展将与SIA上海国际智能工厂展同期举办&#xff0c;展会面积达到60,000平方米&#xff0c;1,200家企业参展&#xff0c;预计120,000万人参观。这场盛会将聚焦各系列标准轴承…