Cherno C++学习笔记 P36 初始化类成员

news2024/12/14 10:05:25

这一篇文章我们主要讲一下如何初始化类成员,并给出一个初始化类成员的小技巧。我们都知道,我们会使用构造函数来初始化我们的类成员变量。

首先我们来举一个简单的小例子,展现一下构造函数的功能:

#include<iostream>
#include<string>

class Entity {
private:
	std::string m_Name;
public:
	Entity() {
		m_Name = "Unkown";
	}
	Entity(const std::string& name) {
		m_Name = name;
	}
	void PrintName() const {
		std::cout << m_Name << std::endl;
	}
};

int main() {
	Entity e0;
	e0.PrintName();
	Entity e1("Cherno");
	e1.PrintName();
	std::cin.get();
}

我们可以看到,我们使用了两个构造函数,一个是调用了默认的构造函数,还有一个调用了输入一个string的构造函数,然后我们打印了它们的名字变量,分别是Unknown和Cherno,没有问题,很棒。

不过我们还有另一种构造函数的写法,称为列表化构造方法。我们展现一下该怎样用:

class Entity {
private:
	std::string m_Name;
	int m_Score;
public:
	Entity()
		:m_Name("Unknown"), m_Score(0)
	{
	}
	Entity(const std::string& name, int score)
		:m_Name(name), m_Score(score)
	{
	}
	void PrintName() const {
		std::cout << m_Name << std::endl;
	}
};

可以看到,我们通过使用冒号,然后一个一个列出需要初始化的变量,就可以实现和构造函数初始化相同的功能了。其实冒号部分是可以与函数名字放在同一行的,但是切一行的话会看起来更整洁一些。

但是需要注意的一点是,这个初始化顺序一定要按照声明的顺序来,不过这个我自己尝试了一下,在VS2022上,默认的C++14版本,是可以调换顺序且输出正确结果的。不过按顺序来也没啥麻烦的。

这样做首先是一种更加简洁的语言风格,因为我们想象一下,如果这个类有十多个甚至更多成员变量,那我们可能得写上十几行几十行初始化,看起来就很麻烦,但是如果使用列表化初始化,那就没有这个问题了,所以听起来是不错的。

但是这样写不仅仅有简洁的效果,实际上列表化的写法也会一定程度上提高效率,我们举一个例子。

#include<iostream>
#include<string>

class Print {
public:
	Print() {
		std::cout << "Print number" << std::endl;
	}
	Print(int value) {
		std::cout << "Print number " << value << "!" << std::endl;
	}
};

class Entity {
private:
	std::string m_Name;
	Print p;
public:
	Entity() {
		m_Name = "Unknown";
		p = Print(8);
	}
};

int main() {
	Entity e;
	std::cin.get();
}

我们看上面的例子,我们不用列表化的方法,而直接用在函数体里面初始化成员的方式进行初始化。按道理来说我们应该只会构造一个Print对象,但是如果我们真的输出结果的话,会发现情况其实更加复杂一些:

神奇的是我们居然打印了两次!相当于我们构造了两次Print类型的对象,那么这个实际上发生了什么?它实际上做的事情是先调用了一次默认构造函数构造了一个Print变量,然后调用了有输入的构造函数构造了一个新的Print变量覆盖掉了旧的那个。

但是如果我们用列表的方式进行初始化,那么会发生什么呢?我们把构造函数改成如下这个样子:

Entity()
	:m_Name("Unknown"), p(Print(8))
{
}

然后我们再运行一遍代码,看看结果是什么样子的:

很好,这样的话我们只初始化了一个Print类型的变量,所以如果使用列表化初始化方法,会提高我们的运行效率。

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

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

相关文章

快速解决git@github.com: Permission denied (publickey)

在使用github进行项目克隆的时候&#xff0c;有些时候会出现“gitgithub.com: Permission denied (publickey)”的错误。这个问题大部分是由于新设备本地密钥未加入gitbub列表中&#xff0c;我们可以通过加入新机器身份验证解决问题。 一、问题现象 二、问题解决 2.1&#xf…

移动端h5自适应rem适配最佳方案

网页开发中&#xff0c;我们常用的单位有如下几个&#xff1a; px&#xff1a;像素固定&#xff0c;无法适配各分辨率的移动设备em: 该单位受父容器影响&#xff0c;大小为父元素的倍数rem: 因为html根元素大小为16px&#xff0c;所以默认 1rem 16px&#xff0c;rem只受根元素…

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

[搜广推]王树森推荐算法——基于物体的协同过滤

基于物体的协同过滤 ItemCF 基于物体的协同过滤&#xff08;Item-Based Collaborative Filtering&#xff0c;简称ItemCF&#xff09;是一种经典的推荐系统算法 基本思想 量化用户对物品的兴趣&#xff0c;通过分析用户的行为来找到与目标物品相似的其他物品&#xff0c;然后…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

打造高效的HIS与DAT文件解析工具

在工业数据采集和存储中&#xff0c;HIS 和 DAT 文件是非常常见的二进制数据格式。然而&#xff0c;解析这些固定块大小的二进制文件并将其转换为易读的 CSV 格式并非易事。本文将深入讲解如何使用 Python 和 PyQt5 打造一款图形化工具&#xff0c;轻松解析和转换这些文件&…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

【JavaEE】网络(2)

一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff1b;当然&#xff0c;我们只要满足进程不同就行&#xff0c;所以即便是同一个主机&#xff0c;只要是不同进程&#xff0c;基于网络来传…

题海拾贝:力扣 141.环形链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP&#xff0c;Server端为 Outside路由器&#xff0c;Client端为 ASA&#xff0c;两个设备的 NTP传输使用MD5做校验。&#xff08;安全 V4 LAB考点&#xff09; 提示&#xff1a;Outside路由器作为 Server端要配置好正确的时间和时区&#xff0c;ASA防…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

markdown入门

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

钉钉机器人消息推送类型案例

CSDN 目录展示 目录 钉钉机器人消息推送1- 文本text类型推送代码案例推送结果参数说明 2- 链接Link类型推送代码案例推送结果参数说明 3- Markdown类型推送代码案例1推送结果1推送代码案例2推送结果2推送代码案例2 (版本2)推送结果2(版本2)参数说明 4- 整体跳转ActionCard类型…

6_Sass 选择器函数 --[CSS预处理]

Sass 提供了一系列的选择器函数&#xff0c;用于操作和组合CSS选择器。这些函数可以帮助你更灵活地创建样式规则&#xff0c;并且可以减少重复代码。以下是几个常用的选择器函数及其用法&#xff1a; 1. selector-append($selector1, $selector2...) selector-append($select…