在C++中成员初始化的区别

2024-09-06 19:28
文章标签 c++ 区别 初始化 成员

本文主要是介绍在C++中成员初始化的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C++中,构造函数中的成员初始化列表(member initializer list)和构造函数体(constructor body)中进行的初始化存在显著的不同。这种不同主要体现在初始化时机、效率和语义上。

成员初始化列表(Member Initializer List)

在你的示例中,CMotorCtrl的构造函数使用了成员初始化列表来初始化成员变量。这是通过在构造函数定义中的冒号:后面列出的。

 

cpp复制代码

CMotorCtrl::CMotorCtrl(CWnd* pParent /*=nullptr*/)
: CDialog(IDD_DIALOG_CTRL, pParent)
, m_strCH1(_T(""))
, m_strCH2(_T(""))
, m_strCH3(_T(""))
, m_strCH_Addr(_T(""))
, m_nSlider1(0)
, m_Addr(1)
, m_mode_ch1(0)
, m_mode_ch2(0)
, m_mode_ch3(0)
, m_Test_Start(0)
, m_strRunPeriod(_T("200"))
{
// 构造函数体
memset(&m_MasterCtrl, 0x00, sizeof(m_MasterCtrl));
m_UpdateFlag = 0;
m_RunCounter = 0;
}
  • 初始化时机:成员初始化列表中的初始化是在调用基类构造函数和成员变量构造之前完成的。这意味着它们发生在对象实际构造的早期阶段。
  • 效率:对于内置类型(如intfloat等)和简单的类类型,使用成员初始化列表通常比在构造函数体内赋值更高效,因为它避免了先默认构造再赋值的开销。
  • 语义:对于某些类型(如引用和const成员),只能使用成员初始化列表进行初始化,因为它们在构造函数体内不能被赋值。

构造函数体(Constructor Body)

构造函数体中的代码(即大括号{}内的代码)在成员初始化列表之后执行。

  • 初始化时机:构造函数体内的代码在成员初始化列表之后执行,这意味着它发生在对象构造的后期阶段。
  • 用途:通常用于执行更复杂的初始化逻辑,或者调用成员函数来初始化对象状态。
  • 注意事项:在构造函数体内,可以修改已经通过成员初始化列表初始化的成员变量的值,但这可能会覆盖之前的初始化。

总结

在你的例子中,m_strCH1m_strCH2等字符串变量和m_nSlider1m_Addr等内置类型变量通过成员初始化列表进行初始化,这是推荐的做法,因为它们避免了不必要的默认构造和赋值开销。而m_MasterCtrl等复杂类型或数组可能需要在构造函数体内使用memset或其他方式进行初始化,因为它们可能需要更复杂的初始化逻辑。

这篇关于在C++中成员初始化的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142901

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字