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.mzph.cn/news/216129.shtml

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

相关文章

如何设定一个N层BiLSTM的Layer,LSTM初始化

如何设定一个N层BiLSTM的Layer&#xff0c;LSTM初始化 前言干货代码解释 结语 前言 目前人工智能已经融入到我们的生活&#xff0c;大数据模型也是层出不穷。那我们就学习一些简单的模型设置。 干货 代码 # This is the original BiLSTM layer setup, def build_bilstm(inp…

【力扣100】54.螺旋矩阵

添加链接描述 class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:if not matrix or not matrix[0]:return list()rows, columns len(matrix), len(matrix[0])order list()left, right, top, bottom 0, columns - 1, 0, rows - 1while left &…

通俗易懂,什么是.NET Core以及.NET Core能做什么

我们都知道.NET Core是一个可以用来构建现代、可伸缩和高性能的跨平台软件应用程序的通用开发框架。可用于为Windows、Linux和MacOS构建软件应用程序。与其他软件框架不同&#xff0c;.NET Core是最通用的框架&#xff0c;可用于构建各种软件&#xff0c;包括Web应用程序、移动…

多线程(Thread)

一、实现多线程 多线程是为了同步完成多项任务&#xff0c;提高资源使用率提高系统使用率。 1、继承Thread类 void run()在线程开启后&#xff0c;此方法将被调用执行&#xff0c;run()封装了被线程执行的代码void start()启动线程&#xff0c;Java虚拟机会调用run方法()、即…

搭建商城系统的构架如何选择?

近期有很多网友在csdn、gitee、知乎的评论区留言&#xff0c;搭建商城系统是选择单体架构还是微服务架构&#xff0c;这里先说结论&#xff0c;如果是纯电商的话&#xff0c;商城系统的架构建议选择单体架构。我们分析下微服务和单体架构的优劣势&#xff0c;就知道了。 一、什…

网易有道强力开源中英双语语音克隆

项目地址&#xff08;基于PromptTTS&#xff09;&#xff1a; https://github.com/netease-youdao/EmotiVoice EmotiVoice Docker镜像 尝试EmotiVoice最简单的方法是运行docker镜像。你需要一台带有NVidia GPU的机器。先按照Linux和Windows WSL2平台的说明安装NVidia容器工具…

ECCV 2024 European Conference on Computer Vision

目录 DatesPeople 官网&#xff1a; https://eccv2024.ecva.net/ 链接 Dates Thursday, February 29, 2024 authors Abstract registration deadlineThursday, March 7, 2024 authors Submission deadlineThursday, March 14, 2024 authors Supplementary materials deadlineM…

17.(vue3.x+vite)组件间通信方式之作用域插槽

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 作用域插槽 父组件中的插槽内容是无法访问到子组件中的数据的,而作用域插槽就是解决获取子组件数据。 父组件代码 <template><div><div>父组件--Hello World!</div><Child>

c++ 快速排序

快速排序 #include <iostream> #include <vector> using namespace std;int partition(vector<int> &nums ,int left ,int right) {int pivot nums[left];int ileft; int jright;while (i<j){while (i<j && nums[j] >pivot) j--;nums[…

Numpy:数据转换成image并保存

Matplotlib库 若没有matplotlib库&#xff0c;则使用一下命令进行安装: pip install matplotlibconda install matplotlib要将 float64 类型的 NumPy 数据转换为图像并保存&#xff0c;可以使用 matplotlib 库。以下是使用 matplotlib 的示例代码&#xff1a; import numpy …

扁平疣的影响?劲松中西医结合医院结合临床经验分析

提到扁平疣&#xff0c;相信都不陌生&#xff0c;要知道它通常不会引起严重的危害&#xff0c;但仍然会给人们带来一些不适和困扰。除了影响美观之外&#xff0c;扁平疣当然还存在其他一些负面影响。为了让更多人知道扁平疣对健康的影响&#xff0c;今日特邀劲松中西医结合医院…

Android filter 和 map: 列表操作的强大工具

在Android开发中&#xff0c;我们经常需要对列表数据进行操作和转换。在这篇博客中&#xff0c;我们将介绍两个强大的列表操作工具&#xff1a;filter 和 map。这些函数可以帮助我们更轻松地处理和转换列表数据&#xff0c;提高开发效率和代码可读性。 1. filter: 筛选出符合条…

android 13.0 app应用安装白名单

1.概述 在13.0系统rom定制化开发中,客户需求要实现应用安装白名单功能,在白名单之中的应用可以安装,其他的app不准安装,实现一个 控制app安装的功能,这需要从app安装流程入手就可以实现功能 PMS就是负责管理app安装的,功能就添加在这里就可以了,接下来看具体实现这个功能…

常用正则表达式

匹配 (string) \([^(]?\)

【JavaWeb学习笔记】8 - HTTP

一、常用文档 请求头 响应头 中间件获取的网页协议和返回的内容 这些称为HTTP协议 请求和响应 常见的请求头 响应头 状态码 HTTP状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务…

【GIS】1.什么是空间分析?

新坑&#xff01;&#xff01;&#xff01; 本系列文章主要参考CHICAGO大学的空间数据科学中心的相关课程(&#xffe3;∇&#xffe3;)/感谢分享&#xff5e; 什么是空间分析 空间分析不仅仅是指做一个地图这么简单&#xff0c;而是为这些位置空间添加实际的值&#xff0c;并…

向量做语义检索,效果测试

语义检索的效果确实不错&#xff0c;特别是在非关键词命中的情况下。就像我这个案例。通过做数据的文本嵌入&#xff0c;然后用向量的做召回。实现了语义的搜索。虽然我搜索的是“中国的首都”&#xff0c;但是把命中北京的也给我召回了&#xff0c;大大提升了召回效果。 其中我…

L类型网络

案例背景 宿舍只提供WIFI上网,网页拨号认证,但是我有其他设备需要上网,只有一个有线网络,这就难办了 路由器,笔记本电脑,其他设备(手机), 路由器在此用于网络有线转无线的功能, 笔记本电脑在此用于,网络认证和网络代理的功能 电脑连上WIFI, 设置 最后,进行手机上操作,连上…

npm install 时,卡在sill idealTree buildDeps没有反应

这个的主要原因是默认的镜像源在国外&#xff0c;国内无法访问或者访问极慢导致的&#xff0c;可以先切换到国内的淘宝镜像源&#xff0c;然后再执行npm install <包名称> 命令就可以了。 具体如下&#xff1a; 1、设置镜像源为国内淘宝的镜像源&#xff1a; npm confi…

docker学习(八、mysql8.2主从复制遇到的问题)

在我配置主从复制的时候&#xff0c;遇到了一直connecting的问题。 起初可能是我ip配置的不对&#xff0c;slave_io_running一直connecting。&#xff08;我的环境&#xff1a;windows中安装了wsl&#xff0c;是ubuntu环境的&#xff0c;在wsl中装了miniconda&#xff0c;mini…