C++ 类的初始化列表

        C++ 中的类必须使用初始化列表的 4 种情况:

一,继承于一个基类,这个基类的构造函数有参数时。

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)
class CBase
{
public:CBase(int value): bBaseValue(value){}~CBase(){}private:int bBaseValue;
};class CTest: public CBase
{
public:CTest(){}~CTest(){}private:int mValue;
};
#pragma pack()int main()
{CTest test;printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

编译错误就是没有找到匹配的基类构造函数,因为没有显式的调用带参数的基类构造函数,所以只能在派生类的初始化列表里显式调用:

class CTest: public CBase
{
public:CTest(): CBase(200){}~CTest(){}private:int mValue;
};

二,有一个或多个对象成员,而这些对象成员的构造函数有参数时。

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)
class A
{
public:A(int a){}~A(){}
};
class CTest
{
public:CTest(){}~CTest(){}private:int mValue;A mA;
};
#pragma pack()int main()
{CTest test;printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

这种情况跟上面的类似,都需要显式地调用带参数的构造函数,否则编译错误:

需要显式调用成员对象的构造函数:

class CTest
{
public:CTest(): mA(10){}~CTest(){}private:int mValue;A mA;
};

三, 当定义有 const 成员变量时

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)class CTest
{
public:CTest(){}~CTest(){}private:const int mValue;
};
#pragma pack()int main()
{CTest test;printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

因为 const 类型的变量是常量,必须有初始化值,且后续不可以进行修改操作。 

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)class CTest
{
public:CTest(): mValue(2){}~CTest(){}private:const int mValue;
};
#pragma pack()int main()
{CTest test;printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

四,当定义有引用成员变量时

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)class CTest
{
public:CTest(): mValue(2){}~CTest(){}private:const int mValue;int &mReference;
};
#pragma pack()int main()
{CTest test();printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

和上面的错误一样,引用类型的变量必须初始化。

#include <stdio.h>
#include <stdlib.h>#pragma pack(4)class CTest
{
public:CTest(int a): mValue(2), mReference(a)//这样引用会有问题,这里只是为了说明初始化列表作为例子{}~CTest(){}private:const int mValue;int &mReference;
};
#pragma pack()int main()
{CTest test(33);printf("sizeof CTest is %llu\n", sizeof(test));return 0;
}

初始化列表顺序问题:初始化顺序按在类中声明顺序进行,否则会出现编译警告。

#include <stdio.h>
#include <stdlib.h>class CTest
{
public:CTest(int val): mValue2(val), mValue1(mValue2){printf("mValue1 = %d, mValue2 = %d\n", mValue1, mValue2);}~CTest(){}private:int mValue1;int mValue2;
};int main()
{CTest test(33);printf("sizeof CTest is %lu\n", sizeof(test));return 0;
}

代码意图是想用构造函数里的参数来初始化 mValue2,然后再用 mValue2 来初始化 mValue1,但实际 mValue1 初始化要先于 mValue2,所以它的值是未知的, 可能是个随机值:

 mValue2 正确赋值了,但 mValue1 并不是预想的是 mValue2 的值,所以还是老老实实地按声明顺序来吧。

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

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

相关文章

处理 Maven jar 包下载失败问题

目录 1、配置国内 Maven 源 配置和检测 settings.xml 配置国内源 2、删除本地 maven 创库的 jar 重新下载 3、其他问题 一般情况下 maven jar 包下载不成功可能有两种情况&#xff1a; 1&#xff09;没有配置国内源 2&#xff09;jar 包需要重新下载 下面详细讲解如何解决这两…

【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错

配置x11转发 jetson远程安装x11转发 安装Xming Xming下载 安装完成后打开安装目录C:\Program Files (x86)\Xming 用记事本打开X0.hosts文件&#xff0c;添加jetson IP地址 后续IP改变需要重新修改配置文件 localhost 192.168.107.57打开Xlaunch Win菜单搜索Xlaundch打开 一…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

机器学习---无偏估计

1. 如何理解无偏估计 无偏估计&#xff1a;就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”&#xff1…

20240128-读书带来的影响

我本身不算是一个特别喜欢读书的人&#xff0c;更多的时候其实是为了读书而读书。在坚持每天读了一小时书之后&#xff0c;我发现自身开始慢慢有些变化。是什么时候突然有了这种感悟呢&#xff0c;是最近每周5小时左右的微信读书以及纸质书籍的阅读&#xff0c;让我体会到了读书…

常见の算法5

位图 一个int类型32字节&#xff0c;可以表示0-31这32个数出没出现过&#xff0c;出现过1没出现0&#xff0c;再扩大一点搞个数组&#xff0c;就可以表示0-1023出没出现过&#xff0c;一个long类型可储存64位 如何把10位组成的数&#xff0c;第四位由1改成零 package class05…

嵌入式linux面试题目总结

Linux系统中常见的面试题目&#xff0c;分享&#xff0c;欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么&#xff1f; CAN&#xff08;Controller Area Network&#xff09;通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

mysql升级5.X到mysql8关键字问题

数据库系统升级&#xff0c;要注意很多东西&#xff0c;5.x版本升级到mysql8&#xff0c;是一次大的版本升级&#xff0c;因此要注意诸多事项. charset更新 关键字 一些在5.x版本没有问题的字段&#xff0c;在mysql8中会触发关键字. 例如&#xff1a; rank&#xff0c;在mys…

VS如何打包环境

以VS2005为例子,做好的软件需要发给客户现场升级,有时候总是因为系统,环境变量不同导致软件不能正常运行打开,这也是程序员非常头疼的问题,今天我们就一起看下打包环境变量. 这样我们的环境变量就打包到setup中了,目标机台安装即可!!!

新概念英语第二册(43)上

【New words and expressions】生词和短语&#xff08;13&#xff09; pole n.&#xff08;地球的&#xff09;极 flight n. 飞行 explorer n. 探险家 lie …

[Python] numpy - 如何对数组进行降维或者升维

什么是数组升维&#xff1f; 数组升维是指将原本低维数组转换为更高维的数组的操作。在编程中&#xff0c;数组是一种存储多个相同类型数据的连续内存空间。升维操作可以通过添加额外的维度来增加数组的维数。 举个例子&#xff0c;将一个一维数组升维为二维数组可以使用resh…

Java集合-Map接口(key-value)

Map接口的特点&#xff1a;①KV键值对方式存储②Key键唯一&#xff0c;Value允许重复③无序。 Map有四个实现类&#xff1a;1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类&#xff1a; 存储结构&#xff1a;哈希表 数组Node[ ] 链表&#xff08;红黑…

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。但这个架构是基于java语言开发的&#xff0c;所以要先进行jdk的安装&#xff0c;如果电脑已经配置过jdk或者是曾经运行成功过java文件&#xff0c;那就可以跳过第一步。 …

想用verilog写一个npu 需要什么学习路线?

要用Verilog编写一个NPU&#xff08;神经处理单元&#xff09;&#xff0c;你需要经过以下学习路线&#xff1a; 数字电路基础&#xff1a; 学习数字电路的基本概念&#xff0c;包括逻辑门、寄存器、时钟信号、信号传输等。 Verilog编程语言&#xff1a; 学习Verilog HDL&…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

【随谈】为什么高端开发岗要求研究过源码?如何研究?

今天来聊一个简单的问题&#xff1a;研究源码有什么用&#xff1f; 不知道你是否注意过&#xff0c;如果找薪资3万以上的岗位&#xff0c;往往都要求研究过框架和中间件源码的优先考虑。 我们随便选几个例子&#xff1a; 这里条件虽然写了很多&#xff0c;但是最重要的都是要…

编程笔记 html5cssjs 063 JavaScrip输出

编程笔记 html5&css&js 063 JavaScrip输出 一、JavaScript 输出方式二、弹出警告框来显示数据三、操作 HTML 元素四、写到 HTML 文档五 、写到控制台小结 JavaScript 输出。JavaScript 没有任何打印或者输出的函数。JavaScript输出主要是显示数据&#xff0c;以使我们看…

Hadoop集群部署流程

前置要求 需要3台虚拟机&#xff0c;系统为Centos7&#xff0c;分别host命名为node1&#xff0c;node2&#xff0c;node3&#xff0c;密码均为root请确保这三台虚拟机已经完成了JDK、SSH免密、关闭防火墙、配置主机名映射等前置操作 在3台虚拟机的/etc/hosts文件中&#xff0…

Java Card调试系统

近年来,嵌入式系统发展迅猛,已经广泛的渗透到了人们日常生活的方方面面中。由于市场对嵌入式系统要求越来越细致深入,致使其开发也越来越复杂。市场日益激烈的竞争趋势致使对嵌入式系统开发周期的要求不断提高,这时支撑软件高效开发的嵌入式开发工具特别是调试工具就显得至关重…

【Docker】快速入门手册

目录 1.概述 1.1.安装 1.2.阿里云镜像加速 1.3.运行原理 2.常用操作 2.1.帮助命令 2.2.镜像操作 2.3.容器操作 2.3.1创建、启动 2.3.2.退出、停止 2.3.3.进入交互式界面 2.3.4.守护式容器交互 2.3.5.查看 2.3.6.删除 2.3.7.拷贝 3.容器数据卷 3.1.概述 3.2.使…