[C++从入门到精通] 11.回顾类内初始化、默认构造函数、=default

news2024/11/22 20:15:29
  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 回顾类内初始化成员变量
      • 二. 默认构造函数
      • 三. =default;和=delete;


一. 回顾类内初始化成员变量

1、描述

C++11里,我们可以为类内成员变量提供一个初始值,那么我们在创建对象的时候,这个初始化值就用来初始化该成员变量。

普通成员变量不给初值的话,系统会默认给其一个缺省值(一个不确定的值),静态成员变量不给初值的话,系统会默认赋予零值

2、类内成员变量初始化的方式

1)头文件内定义成员变量的时候直接赋予初值
class Time 
{
	Q_OBJECT

public:
	Time();
    int m_num = 10;    //方式1
    int m_num = {10};  //方式2
2)构造函数初始化列表(推荐,显得更专业)

参考:[C++ 从入门到精通] 8.构造函数详解、explicit、初始化列表

注意:

const常量成员变量的初始化方式不可以在定义完常量成员变量之后,在构造函数里面进行初始化:

class Time 
{
	Q_OBJECT

public:
	explicit Time();  //默认构造函数
    //const int m_num = 10; //可以
    const int m_num;
Time::Time()
{
	Minute = 10;  //不可以,报错表达式必须是可修改的左值
}
Time::Time():Minute(10)  //构造函数初始化列表方式,可以
{

}

二. 默认构造函数

1、定义:没有参数的构造函数,我们称为默认构造函数。

2、如何初始化类对象?

在生成类的对象时,会自动调用类的构造函数(构造函数初始化列表)来初始化成员变量。

class Time
{
public:
	Time() {};
	int Hour;
	int Minute;
};

Time::Time() :Hour(12), Minute(50)
{

}
int main()
{
	Time myTime;  //生成的对象没有参数,所以会调用默认构造函数
	return 0;
}

在这里插入图片描述

3、如果没有构造函数,如何初始化类对象?

class Time
{
public:
	//Time() {};
	int Hour;
	int Minute;
};
int main()
{
	Time myTime;  
	return 0;
}

在这里插入图片描述
我们看到,即使屏蔽了函数所有的构造函数,在生成对象时,成员变量依然被系统赋予了一个默认的初始值。原因是在我们定义时,如果没有构造函数的情况下,编译器就会为我们隐式的自动定义一个默认构造函数(无参),称为“合成的默认构造函数”。

4、合成的默认构造函数的作用:在没有构造函数的情况下,如果在定义成员变量的时候没有对其进行初始化,系统会在合成的默认构造函数中为其赋予一个默认初始值。如果在定义成员变量的时候对其进行了初始化,则在生成类对象时,其成员变量的初始值不变。

5、总结:

1)没有参数的构造函数,我们称为默认构造函数。在生成无参数的类对象时,会自动调用默认构造函数。

2)一般我们在定义类的时候都需要自定义一个构造函数对成员变量进行初始化的,这是比较正规的写法,合成的默认构造函数这个概念我们了解一下就好。


三. =default;和=delete;

1、=default;

=default;C++11标准中引入的概念,编译器能够为=default;的函数自动生成函数体,相当于定义了一个默认构造函数(不带参数):

class Time
{
public:
    //Time() {};  
	Time() = default;  //适合默认构造函数,效果和上面等价
	Time(int) = default;  //不可以,报错“Time::Time(int)”: 不是可默认为的特殊成员函数
};

注:只有特殊函数(默认构造函数、析构函数、拷贝构造函数等)才可以使用= default;。非特殊函数(带参数的构造函数、普通成员函数)不可以使用= default;= default;等价于{}

2、=delete;

=delete;:显示的禁用某个函数。

class Time
{
public:
	Time() = delete;  //禁止系统生成合成的默认的构造函数
};

这时,我们在生成类对象时:

int main()
{
	Time myTime;  //失败,由于没有默认构造函数,系统也无法自动生成合成的默认构造函数
	return 0;
}

下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

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

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

相关文章

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用seleniumphantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*-from selenium import webdriver from selenium.webdriver.common.keys import Keysimp…

辅助寄存器是干什么用的

目录 请问CPU 的 MREQ 引脚和 IORQ 引脚分别是干什么用的 那这里的引脚是什么含义呢? 程序是指令和数据的集合 辅助寄存器是干什么用的 寄存器的用途取决于它的类型 PC 寄存器也叫作“程序指针”,存储着指向 CPU 接下来 要执行的指令的地址。PC 寄存…

jmeter添加断言(详细图解)

先创建一个线程组,再创建一个http请求。 为了方便观察,我们添加两个监听器,察看结果树和断言结果。 添加断言:响应断言,响应断言也是比较常用的一个断言 设置响应断言:正常情况下响应代码是200。选择响应代…

固态硬盘删除的资料能恢复吗?

固态硬盘(SSD)作为一种存储设备,在读写速度和抗摔性方面具有显著优势,因此备受许多用户的青睐。然而,在使用过程中,由于人为误操作或设备内部故障,固态硬盘可能会导致数据丢失。所以固态硬盘删除…

【WinRAR】去除请购买WinRAR许可

新建rarreg.key文件 在WinRAR安装目录新建rarreg.key文件,文件内容如下: RAR registration datawncnUnlimited Company LicenseUID1b064ef8b57de3ae9b5264122122509b52e35fd885373b214a4a64cc2fc1284b77ed14fa2066ebfca6509f9813b32960fce6cb5ffde62890079861be57…

聊聊分布式架构02——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程:客户端浏览器通过…

slam从入门到精通(稍复杂一点的运动控制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 ros本身只是提供了一个框架,上面对应客户需求,下面对应各个传感器,中间就是各个算法和决策措施。但是robot本身…

SpringCloud之Hystrix高版本熔断器源码解析

Hystrix官方已经停止开发了,Hystrix官方推荐使用新一代熔断器作为Resilience4j。作为新一代的熔断器,Resilience4j有很多优势,比如依赖少,模块化程度较好等优势。 Resilience4j是受Hystrix启发而做的熔断器,通过管理远…

【动手学深度学习】课程笔记 00-03 深度学习介绍及环境配置

目录 00-01 课程安排 02 深度学习介绍 深度学习实际应用的流程 完整的故事 03 环境配置 00-01 课程安排 1. 学习了这门课,你将收获什么? 深度学习的经典和最新模型:LeNet,ResNet,LSTM,BERT&#xff1…

Linux程序崩溃时的信号量(signal)说明

一、概念说明 在程序崩溃的时候,我们将会获取到两个信息: • signal: 信号量,下文将会详细的说明不同的信号量及其含义 • code: 错误码, 除了几个所有信号量(signal) 公共的错误码(code),一般不同信号量(signal)有特定的错误码(code)&#x…

智能工业通信解决方案!钡铼BL124实现Modbus转Ethernet/IP互联!

钡铼技术BL124 Modbus转Ethernet/IP协议网关是一款专为工业自动化领域而设计的先进设备。它提供了可靠的通信解决方案,能够将Modbus通信协议与Ethernet/IP通信协议进行高效转换,实现不同类型设备之间的无缝集成和通信。 添加图片注释,不超过 …

冲刺十五届蓝桥杯P0004递增三元组

文章目录 题目解析代码如下 题目 递增三元组 解析 用到线性代数的知识,原来的三元组一共有27钟组合,不一一列举了。如果将三元组排序一下,得到的27钟组合和原来时一样的,只是顺序变了而已。 我们以b组为核心,遍历b组…

矢量图绘制软件EazyDraw mac中文版软件介绍

EazyDraw mac是一款功能强大且易于使用的矢量绘图软件。 EazyDraw mac软件介绍 矢量绘图工具:EazyDraw 提供了一套全面的矢量绘图工具,包括直线、曲线、多边形、文本框、图形填充等。用户可以使用这些工具创建和编辑精确的矢量图形,无论是简…

电动主轴与气动主轴的优缺点

随着工业自动化的不断发展,主轴的应用越来越广泛,并且不断改进优化。目前,市面上常用的主轴主要有两种:电动主轴和气动主轴。为了更好地选择和使用主轴,我们需要了解电动主轴和气动主轴各有什么优缺点? 电动…

徐明君:企业管理的新视角,业务与行为的整合

随着社会的发展和科技的进步,企业管理在社会化大生产的背景下愈显重要。近日,在一次企业管理的论坛上,众多业界人士针对企业管理的新视角进行了深入探讨,强调了业务管理和行为管理并重的重要性。 业务管理主要侧重于对企业的各种…

CS5366最新设计电路|Typec转HDMI 8K带PD方案设计|带DSC视频压缩技术Typec扩展方案

CS5366支持4K24/25/30/50/60Hz刷新率的HDR,CS5366集成DSC decoded影像解压缩技术,可将DPRX 4Lanes等效宽推升至97.2Gbps或 DPRX 2Lanes等效带宽推升至48.6Gbps ,此功能可改善画面延迟、影像撕裂等问题,可让用户在观看电影或是电玩游戏等高效能影像时有更好的体验。…

unity设计模式——代理模式

Subject类,定义了Real Subject和Proxy的共用接口,这样就在任何使用Real Subject的地方都可以使用Proxy。 abstract class Subject : MonoBehaviour {public abstract void Request(); } RealSubject类,定义Proxy所代表的真实实体。 class R…

nginx高可用配置(五)

keepalived keepalived安装 1.#进入根目录下的 usr目录 cd /usr 2.#安装keepalived yum install keepalived -y 3.安装完成后在根目录etc下会有个keepalived目录 4.进入keepalived目录 cd keepalived/ 5.ll命令查看,会有个配置文件 keepalived.conf 6.ke…

【已解决】Python打包文件执行报错:ModuleNotFoundError: No module named ‘pymssql‘

【已解决】Python打包文件执行报错:ModuleNotFoundError: No module named pymssql 1、问题2、原因3、解决 1、问题 今天打包一个 tkinter pymssql 的项目的时候,打包过程很顺利,但是打开软件的时候,报错 ModuleNotFoundError: …

何林达获得“软件方法建模师”称号

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 何林达做对所有强化自测题,获得“软件方法建模师”称号。 软件方法建模师 满分完成当前所有《软件方法》强化自测题的同学,可获得“软件方法建模师”的称号。…