C++类和对象(下)

目录

一、初始化列表

二、单参构造参数和explicit关键字

三、匿名对象

四、static成员 

五、友元 

六、内部类


一、初始化列表

之前我们在构造函数中写得还不错,也没发现什么问题,为什么C++还有搞一个初始化列表呢?

如下这段代码,对于const类型和引用,他们必须在初始化的时候就被定义,而我们想在构造函数这个 {} 里面去初始化是不可行的。

C++引入了初始化列表来帮助我们完成操作 

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。

初始化列表式每个成员定义的地方,不管你写不写,每个成员都要走初始化列表。 

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

  • 引用成员变量
  • const成员变量
  • 自定义类型成员(且该类没有默认构造函数时)

C++11中,还支持成员声明的地方给值,这个值是缺省值,缺省值会给到初始化列表,初始化列表没有显示给值,就会用这个缺省值。如下

注意:初始化列表的初始化顺序跟成员声明的顺序有关,跟列表顺序无关 

 第一步先初始化了_a

第二部是_b 

 最后才是_c

 对于我们后续开发来讲,尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化。

二、单参构造参数和explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值 的构造函数,还具有类型转换的作用。

举例子,下面的代码竟然可以将一个参数直接赋值给类对象,这实际上也是构造函数的功劳,因为构造函数只有单个参数。

对于43行代码,编译器会自动用  2023  构造出一个临时的类对象(类型转换),再将这个类对象通过默认赋值重载给到d1。

这只适用于单个参数或者除第一个参数无默认值其余均有默认值。

但是C++11添加了新特性,可以支持多个参数。

使用 {}  来进行赋值。这个我们作为了解可以运行即可。

如果给Date类加上explicit关键字,就会禁止单参构造函数类型转化,因此代码就不能通过编译了

三、匿名对象

匿名对象就是没有对象名,并且声明周期只在这一句代码的对象。

 

如果我们不需要这个类对象一直存在,只需短暂使用,那么用匿名对象会更好,占用时间短暂,因为析构很快,并且写起来简洁 。

如下我们可以看到,当这条语句执行完毕后,匿名对象就已经析构了。

四、static成员 

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化

如下图所示,static成员想在声明的时候初始化,后面交给初始化列表去操作,是不可以的。

 我们需要放到类外面去定义,如此才不会报错。

我们需要注意,静态成员是所有类对象共有的,他存放在静态区,因此类对象的大小是不算静态成员的。如果有非静态成员,那么类对象大小就全看非静态成员,如果全是静态成员,那么类对象大小就为1,代表站位

 我们的代码思路是构造一个类对象,_a++ ,从代码可以看到,类对象a 和 aa他们的_a都是同一个。这可以作为一个类对象的计算器。

但是这里我们会发现,想要调用Print()函数,就必须要构造出类对象,不管是临时的还是其他,都得构造类对象,但是这样一来,我们的初心就变了,_a 会发生改变,那么有没有什么方法可以让我们能够简便的调用Print()并且不让_a发生改变呢?

这就需要将Print()设置为静态函数了

静态函数只能调用静态的成员变量,非静态的调不动。变成静态函数  _c  就会报错,因为静态函数没有this指针,而为啥静态成员_a能调得动呢?还是因为 _a 是静态变量,所有类成员都共用这一份,因此可以调用。

我们去掉打印 _c 只看 _a,我们可以直接用   类名 :: Print()  去直接打印,不会发生_a++的情况。

五、友元 

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。

上一篇文章 日期类实现,为了让日期类能够使用cout输出,我们就使用了友元,因为类函数第一个默认的参数是this指针,下面代码虽然看起来out是第一个,实际上是第二个参数。因此重载后想要运行就得是   d << cout;

ostream& Date::operator<<(ostream& out)

 想要 cout << d,就得写成友元的形式

friend ostream& operator<<(ostream& out, const Date& d);
friend istream& operator>>(istream& in, Date& d);

 友元注意事项

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用原理相同

友元不仅仅可以是一个函数,还可以是一个类 

如下在Date类里面创建了一个Time类对象,但是你无法访问Time类的私有成员,

但你只需在Time类上添加一个Date类的友元声明,在Date类里面就可以访问到Time类的私有成员了。

友元类注意事项

  • 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
  • 友元关系是单向的       不具有交换性。 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
  • 友元关系不能传递       如果C是B的友元, B是A的友元,则不能说明C时A的友元。 友元关系不能继承,在继承位置再给大家详细介绍。

六、内部类

内部类的概念很简单   ,如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

如图,B是A的内部类,B类受A类域和访问限定符的限制,其实他们两个是独立的类。

同时要注意,去算A类对象的大小,是不会管A类有没有内部类,依然是看A类的成员变量。 

要想创建B类的类对象,需要通过A类的作用域去找。

内部类就是外部类的友元类

在B类中创建A类对象,可以直接访问到A类的私有成员。

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

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

相关文章

mars3d的api文档关于addDynamicPosition查找使用说明

示例链接&#xff1a;功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 api地址&#xff1a;Mars3D三维可视化平台 | 火星科技 说明&#xff1a; 1.用户反馈不知道如何搜索这个属性的用法 说明&#xff1a; 1. 示例代码中的graphic.addDynamicPosition()说明这个addDynam…

基本微信小程序的二手车交易平台

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

@MultipartConfig注解

前言&#xff1a; 在学习Javaweb的Servlet文件上传和下载的过程中&#xff0c;我们会遇到一个特殊的注解---MultipartConfig。 MultipartConfig的适用情况&#xff1a; 1.文件上传: 当您的应用程序需要接收用户上传的文件时&#xff0c;可以在相应的 Servlet 上使用 Multipart…

Jmeter连接mysql数据库详细步骤

一、一般平常工作中使用jmeter 连接数据库的作用 主要包括&#xff1a; 1、本身对数据库进行测试&#xff08;功能、性能测试&#xff09;时会需要使用jmeter连接数据库 2、功能测试时&#xff0c;测试出来的结果需要和数据库中的数据进行对比是否正确一致。这时候可以通过j…

C++ 位图与布隆过滤器

目录 前言位图场景演示应用场景模拟实现问题例题 布隆过滤器例子理解应用 例题 前言 位图与布隆过滤器是用来在海量数据中判断一个数据在不在的问题的数据结构&#xff0c;这种数据结构在存储空间上大大的优于红黑树、哈希等数据结构 位图 我们为了处理一个数据在海量数据中…

SQL开发笔记之专栏介绍

Sql是用于访问和处理数据库的标准计算机语言&#xff0c;使用SQL访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;Mysql、PostgresSql、Oracle、Sybase、DB2等等&#xff0c;数据库无非围绕着“增删改查”的核心业务进行开发。并且目前绝大多数的后端程序开发…

很烦的Node报错积累

目录 1. 卡在sill idealTree buildDeps2、Node Sass老是安装不上的问题3、unable to resolve dependency tree4、nvm相关命令5、设置淘宝镜像等基操5.1 镜像 5.2 npm清理缓存6、Browserslist: caniuse-lite is outdated loader 1. 卡在sill idealTree buildDeps 参考&#xf…

国际通用的Bug管理工具推荐:多款工具助力项目开发与管理

国际通用的bug管理工具有&#xff1a;1、Zoho Projects&#xff1b;2、Tracup&#xff1b;3、Bugtags&#xff1b;4、QC(QualityCenter)&#xff1b;5、Bugzilla&#xff1b;6、EasyBUG&#xff1b;7、Mantis&#xff1b;8、WebIssues。Zoho Projects拥有专业的缺陷管理模块&am…

复数的三角形式与指数形式

See https://blog.csdn.net/u011089570/article/details/102685877

深入了解基数排序:原理、性能分析与 Java 实现

基数排序&#xff08;Radix Sort&#xff09;是一种非比较性排序算法&#xff0c;它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。 基数排序原理 基数排序的基本原理是按照低位先排序&…

android 固定进度环形刷新效果

android 固定进度无限旋转的环形效果 效果图 Activity 中使用 val rotation: ObjectAnimator ObjectAnimator.ofFloat(progressBar, "rotation", 0f, 360f) rotation.duration 000 // 旋转持续时间为2秒 rotation.repeatCount ObjectAnimator.INFINITE // 设置为…

保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题

文章目录 参考文章安装JDK并配置环境变量安装JDK配置JDK相关的环境变量 Android studio 安装下载Android studiogradle下载慢解决方法 安装Android SDK选择jdk版本安装SDK并配置环境变量 参考文章 原文链接 原文链接 安装JDK并配置环境变量 安装JDK 下载地址 下载后双击安装…

优化|优化处理可再生希尔伯特核空间的非参数回归中的协变量偏移

原文&#xff1a;Optimally tackling covariate shift in RKHS-based nonparametric regression. The Annals of Statistics, 51(2), pp.738-761, 2023.​ 原文作者&#xff1a;Cong Ma, Reese Pathak, Martin J. Wainwright​ 论文解读者&#xff1a;赵进 编者按&#xff1a; …

mac上安装mysql

下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 可以选择dmg安装包&#xff0c;也可以选择tar包。 1、dmg安装包&#xff1a; 1.1&#xff09;安装&#xff1a; 类似windows的exe&#xff0c;直接next即可。 注意&#xff1a;安装完成之后会弹出一个…

redis 哨兵 sentinel(一)配置

sentinel巡查监控后台master主机是否故障&#xff0c;如果故障根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 sentinel 哨兵的功能 监控 监控主从redis库运行是否正常消息通知 哨兵可以将故障转移的结果发送给客户端故障转移 如果master异常&#xff0c;则…

解锁远程联机模式:使用MCSM面板搭建我的世界服务器,并实现内网穿透公网访问

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 前言 MCSManager是一个…

Flask框架配置celery-[1]:flask工厂模式集成使用celery,可在异步任务中使用flask应用上下文,即拿即用,无需更多配置

一、概述 1、celery框架和flask框架在运行时&#xff0c;是在不同的进程中&#xff0c;资源是独占的。 2、celery异步任务如果想使用flask中的功能&#xff0c;如orm&#xff0c;是需要在flask应用上下文管理器中执行orm操作的 3、使用celery是需要使用到中间件的&#xff0…

【【萌新的SOC学习之基于BRAM的PS和PL数据交互实验】】

萌新的SOC学习之基于BRAM的PS和PL数据交互实验 基于BRAM的PS和PL的数据交互实验 先介绍 AXI BRAM IP核控制器的简介 AXI BRAM ip核 是xilinx提供的一个软核 这个ip核被设计成 AXI的一个从机接口 用于AXI互联的集成 系统的主设备和本地的RAM进行通信 &#xff08;我们可以通过这…

TensorFlow学习:在web前端如何使用Keras 模型

前言 在上篇文章 TensorFlow学习&#xff1a;使用官方模型进行图像分类、使用自己的数据对模型进行微调中我们学习了如何使用官方模型&#xff0c;以及使用自己的数据微调模型。 但是吧&#xff0c;代码一直是跑在Python里&#xff0c;而我本身是做前端开发的。我是很想让它在…

Idea报错 java: 程序包org.springframework.boot不存在 解决方法

发现我的是因为更改了maven的主路径和本地仓库路径&#xff0c;但是新建了一个工程后&#xff0c;设置就恢复默认了。需要重新设置正确路径。 应用后会重新下载依赖项 之后虽然还会报错&#xff0c;但是已经不影响项目运行&#xff0c;配置成功