C++冷知识:构造函数初始化时,为什么使用 : 而不是使用作用域内初始化对象?

news2025/2/7 11:57:08

:是什么?

这样的行为被称之为初始化列表。具体展示如下:

直接初始化对象。

以一个线程池类为例:

class ThreadPool
{
public:

    // 构造函数,创建指定数量的线程
    ThreadPool(size_t num_threads) : stop(false)
    {
        ....
    }

    // 析构函数,销毁线程池
    ~ThreadPool()
    {
        ...
    }

private:
    ...
    bool stop;       // 线程池是否被销毁的标志
};

传入值初始化对象

当初始化队列包含多个对象时,以,间隔

class ThreadPool
{
public:

    // 构造函数,创建指定数量的线程
    ThreadPool(size_t num_threads, bool flag) : stop(false), flag(flag)
    {
        ....
    }

    // 析构函数,销毁线程池
    ~ThreadPool()
    {
        ...
    }

private:
    ...
    bool stop;       // 线程池是否被销毁的标志
    bool flag;
};

初始化列表初始化复杂数据结构

使用初始化列表可以在创建对象时直接初始化复杂数据结构的成员变量,避免了在构造函数体中手动初始化的复杂过程。这样可以提高代码的效率和可读性,减少代码的执行时间和内存占用。因此,在使用复杂数据结构时,使用初始化列表是一个合适的选择。例如,如果一个类的成员变量是一个vector,可以使用初始化列表来初始化它:

class MyClass {
public:
    MyClass() : my_vector{1, 2, 3, 4, 5} {}
private:
    std::vector<int> my_vector;
};

这样就可以在创建对象时直接初始化my_vector,避免了手动添加元素的复杂过程。

两者的不同有哪些

  • 初始化列表和作用域内初始化都可以用来初始化对象的成员变量,但它们的实现方式效果有所不同。

  • 使用初始化列表可以对象创建时直接初始化成员变量,避免了不必要的中间步骤。这样可以提高代码的效率可读性减少代码的执行时间内存占用。此外,使用初始化列表还可以避免一些编译器优化问题,使代码更加稳定可靠

  • 而在作用域内初始化对象会在构造函数体中执行,需要额外的代码来初始化成员变量。这样会增加代码的复杂度执行时间降低代码的可读性效率。此外,作用域内初始化可能会导致一些编译器优化问题,使代码不够稳定和可靠。

  • 因此,使用初始化列表比作用域内初始化更加优秀,是更好的选择。

总结

  1. 初始化列表,可以自定义初始化、传入值初始化、数据结构初始化。
  2. 初始化列表比作用域内赋值更加方便、快捷、稳定。

使用初始化列表时需要注意以下几个问题

  1. 初始化列表中的成员变量顺序应该与类定义中的顺序一致,否则可能会导致未定义的行为。
    错误示例:
class ThreadPool {
public:
    ThreadPool(size_t num_threads, bool flag) : flag(flag), stop(false) {};
    // other methods and variables

private:
    bool stop; // 这里定义顺序和初始化时不一致,可能有问题。
    bool flag;
    // other variables
};

在这个例子中,初始化列表中的成员变量顺序与类定义中的顺序不一致,可能会导致未定义的行为。

  1. 如果成员变量是const或引用类型,必须在初始化列表中进行初始化,否则会导致编译错误。

错误示例:

class Example {
public:
    Example(int a) {
        const int b = a;
    }
private:
    const int b;
};

在这个例子中,成员变量b是const类型,但是没有在初始化列表中进行初始化,会导致编译错误。在这里插入图片描述

  1. 如果成员变量是指针类型,需要注意指针的生命周期,避免出现悬空指针或内存泄漏的问题。

错误示例:

class Example {
public:
    Example() {
        int* p = new int(10);
    }
    ~Example(){}
private:
    int* p;
};

在这个例子中,成员变量p是指针类型,但是没有在析构函数中释放内存,会导致内存泄漏。

  1. 如果成员变量是类类型,需要确保该类的构造函数已经被定义和实现,否则会导致编译错误。

错误示例:

class Example {
public:
    Example() {}
private:
    OtherClass other;
};

class OtherClass {
public:
    OtherClass(int a) {}
};

在这个例子中,成员变量other是OtherClass类型,但是OtherClass的构造函数没有被定义和实现,会导致编译错误。

正确示例:

class OtherClass {
public:
    OtherClass(int a) {}
};

class Example {
public:
    Example() : other(0) {}
private:
    OtherClass other;
};
  1. 如果成员变量是基本类型,可以使用默认值来初始化,避免重复的代码。

错误示例:

class Example {
public:
    Example() {
        a = 0;
        b = 0;
    }
private:
    int a;
    int b;
};

在这个例子中,成员变量a和b可以使用默认值来初始化,避免重复的代码。

正确示例:

class Example {
public:
    Example() : a(0), b(0) {}
    
private:
    int a;
    int b;
};

总之,使用初始化列表时需要仔细考虑每个成员变量的初始化方式和顺序,确保代码的正确性和可读性。

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

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

相关文章

【计算摄影学】总目录

1.数码相机 《数码相机中的图像传感器和信号处理》和《光与赢的魔幻乐园有趣的透镜》 1.1 数码相机概览 1.2 数码相机中光学系统 2.图像传感器 《数码相机中的图像传感器和信号处理》和《智能cmos图像传感器与应用》 2.1 图像传感器基础知识 2.2 CCD图像传感器 2.3 CMOS图像…

RankNet方法在移动终端的应用

RankNet方法在移动终端的应用 RankNet代码示例pythonJava 移动终端的应用 RankNet RankNet 是一种排序学习方法&#xff0c;由 Microsoft Research 提出&#xff0c;用于解决排序问题。它基于神经网络&#xff0c;并使用一对比较的方式来训练和优化模型。 在 RankNet 中&…

你的企业还没搭建这个帮助中心网页,那你太落后了!

作为现代企业&#xff0c;拥有一个完善的帮助中心网页已经成为了不可或缺的一部分。帮助中心网页不仅可以提供给用户有关产品或服务的详细信息&#xff0c;还可以解答用户的疑问和提供技术支持&#xff0c;使用户在使用产品或服务时遇到问题可以很快地得到解决。因此&#xff0…

内网隧道代理技术(四)之NETSH端口转发

NETSH端口转发 NETSH介绍 netsh是windows系统自带命令行程序&#xff0c;攻击者无需上传第三方工具即可利用netsh程序可进行端口转发操作&#xff0c;可将内网中其他服务器的端口转发至本地访问运行这个工具需要管理员的权限 本地端口转发 实验场景 现在我们有这么一个环境…

AntDB存储技术——水平动态扩展技术

数据库集群安装完成后&#xff0c;其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加&#xff0c;数据库集群中的可用存储空间不断减少&#xff0c;面临数据存储容量扩充的需求。 通过增加数据节点&#xff0c;扩充集群数据容量&#xff0c;必然需要对已有数…

云服务器是什么? 云服务器有哪些选择?

欢迎前往我的个人博客云服务器查看更多关于云服务器和建站等相关文章。 随着互联网技术的发展和云计算技术的应用&#xff0c;越来越多的企业倾向于使用云服务器来满足其不断增长的计算需求。云服务器是一种基于云计算技术的虚拟服务器&#xff0c;它能够为企业提供高性能、可…

创业很长时间以后

创业过很长时间以后…综合能力是有滴 创业和打工后的思维习惯 为了效率&#xff0c;一般情况是这样滴 趣讲大白话&#xff1a;区别还是有滴 【趣讲信息科技195期】 **************************** 创业还是很难滴 每年成立很多新公司 有很多公司关门 公司平均生存时间&#xff1…

AntDB 企业增强特性介绍——AntDB在线数据扩容关键技术

数据库集群安装完成后&#xff0c;其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加&#xff0c;数据库集群中的可用存储空间不断减少&#xff0c;面临数据存储容量扩充的需求。 传统的在线扩容的流程大致如下。 &#xff08;1&#xff09;在集群中加入新的 …

Golang | Web开发之Gin路由访问日志自定义输出实践

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

2022届本科毕业生10大高薪专业:大数据专业进入top3

对于普通人来讲&#xff0c;报考一个高薪的职业还是重中之重。那么什么专业高薪呢&#xff0c;很多人觉得是程序员&#xff0c;但这是职业而不是大学专业&#xff0c;专业千千万&#xff0c;选什么好呢&#xff0c;接下来看一看。 最近国家统计局发布了2022年城镇单位就业人员…

MMU翻译的时候以哪种level去执行是什么意思

【问题】 以哪个el去执行是什么意思&#xff1f;执行这条指令就会切到切换指令里指定的el吗&#xff1f; 【回答】 在一个core中&#xff0c;至少有一下Translation regime&#xff0c;AT S12E2R, <Xt> 就是使用EL2 Translation regime完成地址翻译。 Secure EL1&…

Cadence Allegro PCB设计88问解析(二十八) 之 Allegro中dimension environment命令使用(添加及删除尺寸标注)

一个学习信号完整性仿真的layout工程师 最近看到关于Anti Etch的设置&#xff0c;因为本人之前在layout设计是使用过这个命令。后来去到别的公司就不用了&#xff0c;从网上看到说这个命令是用来负片设计的。在这里在说下正片和负片的概念&#xff1a; 正片&#xff1a;是指在a…

机器学习|监督学习|无监督学习|8:20~9:20

目录 一、监督学习(Supervised learning) ​​​​​​​2.1分类(classification) 2.2回归(regression) 泛化能力 Generalization Ability 欠拟合 过拟合 不收敛 2.3 K近邻算法 k近邻分类​ k近邻回归 KNN变种 二、无监督学习(Unsupervised learning) 2.1 聚类(c…

[迁移学习]域自适应代码解析

一、概述 代码来自&#xff1a;https://github.com/jindongwang/transferlearning&#xff0c;可以前往github下载代码&#xff0c;本文涉及的代码的位置为&#xff1a;Code->DeepDA。理论基础可以参见&#xff1a;[迁移学习]域自适应 整体网络结构如下&#xff1a;可以视为…

Win7下静态变量析构导致进程卡死无法退出问题解决

项目中在用户机器Win7系统上好几次出现进程卡死&#xff0c;无法退出&#xff0c;在用户机器上抓取了dump&#xff0c;发现是在DllMain函数中执行了静态变量的析构&#xff0c;这个静态变量析构的时候会使用std::condition_variable 类型的成员变量通知其他线程退出。同时本地在…

PDF怎样转换成长图?这个方法,超级简单!

在当今社会&#xff0c;PDF文档广泛应用于各个领域。然而&#xff0c;在某些情况下&#xff0c;我们可能需要将多个PDF页面合并成一个单独的长图&#xff0c;以便更方便地浏览、共享或嵌入到其他文件中。为了满足这一需求&#xff0c;记灵在线工具应运而生&#xff0c;它为我们…

一种全新的图像变换理论的实验(六)——研究目的替代DCT和小波

一、变换算法在图像视频中的核心作用 我们国产的变换算法是比较少的&#xff0c;基本上都是在小波、DCT和FFT上发展优化升级的应用。我之前的文章给出了一种基于加权概率模型的变换算法&#xff0c;该算法在一定的程度上能有效的保存低频数据。而且我基于该算法给出了一些新的…

微信小程序快速开发— TDesign模版初始化

最近有个商城类的小程序业务需要快速上线&#xff0c;看了一下微信官方的模版库&#xff0c;相中了TDesign&#xff0c;调研了半天&#xff0c;决定就从这个开始干。 调研的两个重点&#xff1a; 1、网络请求&#xff0c;即数据获取 2、模板本身存在些bug&#xff0c;如&…

从Kotlin中return@forEach了个寂寞

点击上方蓝字关注我&#xff0c;知识会给你力量 今天在Review&#xff08;copy&#xff09;同事代码的时候&#xff0c;发现了一个问题&#xff0c;想到很久之前&#xff0c;自己也遇到过这个问题&#xff0c;那么就来看下吧。首先&#xff0c;我们抽取最小复现代码。 (1..7).f…

Python 基于人脸识别的实验室智能门禁系统的设计与实现,附源码

1 简介 本基于人脸识别的实验室智能门禁系统通过大数据和信息化的技术实现了门禁管理流程的信息化的管理操作。平台的前台页面通过简洁的平台页面设计和功能结构的分区更好的提高用户的使用体验&#xff0c;没有过多的多余的功能&#xff0c;把所有的功能操作都整合在功能操作…