C++对象模型(17)-- 构造函数语义学:成员初始化列表

1、必须用初始化列表的场景

(1)成员变量是引用类型,必须在初始化列表中初始化。

(2)成员变量是const类型,必须在初始化列表中初始化。

(3)如果类继承自一个父类,并且父类中有带初始化列表的构造函数,必须在初始化列表中初始化父类。

class Base {
public:Base(int i) { }
};class Derive:public Base {
public:Derive(int i) : Base(i){}
};

(4)成员变量是类类型,且这个类的构造函数带参数。

class Item {
public:Item(int i) { }
};class MyDemo {
public:MyDemo(int i) : item(i){}Item item;
};

2、初始化列表的执行时机

初始化列表是在构造函数之前执行的。

我们可以用下面的代码来验证:

class Item {
public:Item() { }Item(const Item& _item) {cout << " Item拷贝构造函数" << endl;}
};
class Derive {
public:Derive() { cout << " Derive默认构造函数" << endl; }Derive(Item& _item) : item(_item) { cout << " Derive带初始化列表构造函数" << endl; }Item item;
};int main()
{Item _item;Derive derive(_item);return 0;
}

执行结果如下:

从运行结果看,初始化列表是在构造函数之前运行的。

3、按成员变量的声明顺序初始化,而不是根据初始化列表中的前后顺序。

class X{
public: X(int val) : j(val), i(j){}
private:int i;int j;
}

其实在这个时候,构造函数是这么初始化的:

X::X(int val){i = j;j = val;
}

所以最终的结果是j = val, 但i的值未知。

4、初始化列表的优点

一般地,放在构造函数初始化列表中进行初始化,比放在构造函数中初始化效率更高。

我们可以通过代码来验证这个结论:

(1)构造函数中初始化

class Item {
public:Item() { cout << " Item默认构造函数" << endl; }Item(int i) { cout << " Item(int)构造函数" << endl; }Item(const Item& _item) {cout << " Item拷贝构造函数" << endl;}Item& operator = (const Item& _item) {cout << " Item拷贝赋值运算符" << endl;return *this;}
};class Derive {
public:Derive(int i){ item = Item(i);cout << " Derive带初始化列表构造函数" << endl; }Item item;
};int main()
{Derive derive(2);return 0;
}

运行结果:

(2)初始化列表中初始化

Derive(int i) : item(i){}

运行结果:

可以看到,初始化列表初始化时少了1次默认构造函数和1次拷贝赋值运算符。

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

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

相关文章

前端自学需要把大量时间放在 HTML、CSS 吗?

前言 html和css其实不需要花费太多的时间&#xff0c;html暂且不说&#xff0c;css各类的属性太多了&#xff0c;平时如果只是简单做一些小网站根本不需要全部掌握&#xff0c;只需要掌握一些基础常用的即可&#xff0c;一般遇到不会的也可以直接查文档&#xff0c;就我个人来…

主打的就是一蠢

var x "abc"; // 不清楚x的用途function a(b, c, d) {// 一堆未注释的代码...// ... }// 混合使用单引号和双引号 var message "Its a beautiful day!";fetch("https://xxx/api/data").then(response > response.json()).then(data > {/…

三级等保-linux服务器三权分立设置

安全问题 安全控制点 风险分析 风险等级 标准要求 加固建议 服务器未严格按照系统管理员权限、审计管理员权限、安全管理员权限进行分配管理员账户&#xff0c;未实现管理员用户的最小权限划分。 访问控制 可能存在管理员越权操作的风险 中 d)应授予管理用户所需的最…

Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图 插件安装 先说 word 文件是docx-preview插件 excel文件是用 xlsx 插件 介绍后端返回的数据 因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含: url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示…

pytorch分布式数据训练结合学习率周期及混合精度

文章目录 1、SPAWN方式2、torchrun 方式 正如标题所写&#xff0c;我们正常的普通训练都是单机单卡或单机多卡。而往往一个高精度的模型需要训练时间很长&#xff0c;所以DDP分布式数据并行和混合精度可以加速模型训练。混精可以增大batch size. 如下提供示例代码&#xff0c;经…

Spring MVC(一)【什么是Spring MVC】

重点 Spring&#xff1a;IOC 和 AOP 。 Spring MVC &#xff1a;Spring MVC 的执行流程。 SSM 框架的整合&#xff01; Spring 和 Mybatis 我们不建议使用太多注解&#xff0c;Spring MVC 建议全部使用注解开发&#xff01; 1、MVC 回顾 1.1、什么是MVC MVC是模型(Model)…

chrome历史版本下载

chrome历史版本下载 windows Google Chrome all versions on Windows linux版本 Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒

软件架构风格总结以及场景应用

目录 前言1. 数据流风格2. 调用/返回风格3. 独立构件风格4. 解释器风格5. 仓库风格 前言 软件架构风格可以几个大类&#xff1a; 数据流风格&#xff1a;有批处理风格、管道-过滤器调用/返回风格&#xff1a;有主程序/子程序、面向对象、层次结构等独立构件风格&#xff1a;有…

藏在超级应用背后的逻辑和哲学

众所周知&#xff0c;Elon Musk 想将 Twitter 重新设计定位成一款“超级应用 - X”的野心已经不再是秘密。伴随着应用商店中 Twitter 标志性的蓝鸟 Logo 被 X 取代后&#xff0c;赛博世界充满了对这件事情各种角度的探讨与分析。 Musk 曾经无数次通过微信这一样本来推广他的“超…

Linux:命令行参数和环境变量

文章目录 命令行参数环境变量环境变量的概念常见的环境变量PATH 环境变量表本地变量和环境变量命令分类 本篇主要解决以下问题&#xff1a; 什么是命令行参数命令行参数有什么用环境变量是什么环境变量存在的意义 命令行参数 在学习C语言中&#xff0c;对于main函数当初的写…

iOS开发UITableView的使用,区别Plain模式和Grouped模式

简单赘述一下 的创建步骤 // 创建UITableView self.tableView [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; // 设置数据源和代理 self.tableView.dataSource self; self.tableView.delegate self; // 注册自定义UITableViewCe…

【数据结构】830+848真题易错题汇总(自用)

【数据结构】830848易错题汇总(10-23) 文章目录 【数据结构】830848易错题汇总(10-23)选择题填空题判断题简答题&#xff1a;应用题&#xff1a;算法填空题&#xff1a;算法设计题&#xff1a;(待补) 选择题 1、顺序栈 S 的 Pop(S, e)操作弹出元素 e&#xff0c;则下列(C )是正…

数组中指针不同加1的区别

#include <iostream> int main(){int a[5] {1,2,3,4,5};int* p (int*)(&a1);printf("%d",*(p-1)); // 这段代码会输出4 }原因&#xff1a; array和&array的值是一样的&#xff0c;但是他们代表的意义完全不一样&#xff0c;array是数组首元素的首地址…

Android中使用Glide加载圆形图像或给图片设置指定圆角

一、Glide加载圆形头像 效果 R.mipmap.head_icon是默认圆形头像 ImageView mImage findViewById(R.id.image);RequestOptions options new RequestOptions().placeholder(R.mipmap.head_icon).circleCropTransform(); Glide.with(this).load("图像Uri").apply(o…

最新Tuxera NTFS2024破解版mac读写NTFS磁盘工具

Tuxera NTFS for Mac是一款Mac系统NTFS磁盘读写软件。在系统默认状态下&#xff0c;MacOSX只能实现对NTFS的读取功能&#xff0c;Tuxera NTFS可以帮助MacOS 系统的电脑顺利实现对NTFS分区的读/写功能。Tuxera NTFS 2024完美兼容最新版本的MacOS 11 Big Sur&#xff0c;在M1芯片…

php文本转语音功能插件

当前插件集成了百度文本转语音功能,支持laravel 9版本以上. 下载方式: 1、通过composer下载:composer require yreborn/laravel-speech 2、在composer.json 新增 “yreborn/laravel-speech”: “dev-main”&#xff0c;在命令行使用composer install进行安装 1、创建config/…

Oracle数据库 ORA-28001: the password has expired解决方法

今天在用dbvisualizer登录数据库的时候&#xff0c;报了the password has expired的错误&#xff0c;于是上网查了一下原因&#xff0c;是因为数据库密码过期了&#xff0c;因为默认的是180天。 解决方法&#xff1a; 1&#xff09;用系统用户登录 #在cmd终端输入&#xff1…

基于晶体结构优化的BP神经网络(分类应用) - 附代码

基于晶体结构优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于晶体结构优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.晶体结构优化BP神经网络3.1 BP神经网络参数设置3.2 晶体结构算法应用 4.测试结果…

【单片机基础】使用51单片机制作函数信号发生器(DAC0832使用仿真)

文章目录 &#xff08;1&#xff09;DA转换&#xff08;2&#xff09;DAC0832简介&#xff08;3&#xff09;电路设计&#xff08;4&#xff09;参考例程&#xff08;5&#xff09;参考文献 &#xff08;1&#xff09;DA转换 单片机作为一个数字电路系统&#xff0c;当需要采集…

UE5 运行时生成距离场数据

1.背景 最近有在运行时加载模型的需求&#xff0c;使用DatasmithRuntimeActor可以实现&#xff0c;但是跟在编辑器里加载的模型对比起来&#xff0c;室内没有Lumen的光照效果。 图1 编辑器下加载模型的效果 图2 运行时下加载模型的效果 然后查看了距离场的数据&#xff0c;发现…