Effective C++ 读书笔记——条款04:确定对象被使用前已先被初始化

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

Core List

1. 初始化

(1) 内置类型 :手工初始化

(2) 非内置类型 :构造函数初始化


2. 初始化和赋值的区别

(1) 赋值

Man::Man(const string& name, const string& info) {

    theName =  name; // 三条语句为赋值语句而非初始化操作

    theInfo = info;

    theAge = 18;

}

注:【初始化时间】:C++规定对象的初始化操作发生在进入构造函数体之前,即调用了default构造函数进行初始化。

       【内置类型初始化特例】:由于theAge为内置类型,不确保在赋值之前一定被初始化。

       【赋值操作缺点】:效率低


(2) 初始化列表

例1:调用copy构造函数

Man::Man(const string& name, const string& info) : theName(name), theInfo(info), thAge(0) {}

注:【运行机制】:theName 以 name为初值调用copy构造函数

       【内置类型初始化特例】:theAge为内置类型,其赋值和初始化的成本基本相同,但为保证一致性可以均使用初始化列表

例2:调用default构造函数

Man::Man() : theName(), theInfo(), thAge(0) {}

注:【运行机制】:调用theName的default构造函数

总结:

【初始化次序】:同声明顺序有关,同初始化列表次序无关;基类先于派生类

【内置对象】:初始化和赋值成本相同,但对于const 和 reference 类型必须使用初始化


3 不同编译单元内 “non-local static对象” 的初始化次序
(1) static 对象

【变量定义】:包括 global 对象,定义域namespace 作用域内的对象,在classes内、在函数内、以及在文件作用域内被声明为static的对象。(除堆,栈内的对象)

【生命周期】:从被构造出来直到程序终止

(2) static对象分类

【local static 对象】:函数内的 static 对象,在函数第一次调用时构造初始化,程序结束时消失

【non-local static 对象】:非函数内的 static 对象,在main函数调用之前初始化,程序结束时消失

(3) 多个non-local 对象的初始化顺序 

注 :a. 在同一个文件或不同编译单元(不同文件)中,如果存在多个non-local static 对象,它们均需要在 main 函数被调用之前被构造,但是构造的顺序是“不定的”。

        b. 编译单元的含义:产出单一目标文件的那些源码。基本上包括单一源码文件和其所含入的头文件。

        c. 结论:不能用某个non-local static 对象去初始化另一个 non-local static 对象,无论这两个 non-local static 对象是否在同一个编译单元中。

例:





【绝版C++书籍】《Effective STL》读书笔记 《Effective STL》读书笔记写在前面《Effective STL》中可能过时的内容1 容器第1条:慎重选择容器类型。第2条:不要试图编写独立于容器类型的代码。第3条:确保容器中的对象拷贝正确而高效。第4条:调用empty而不是检查size()是否为0。第5条:区间成员函数优先于与之对应的单元素成员函数。第6条:当心C++编译器最烦人的分析机制。第7条:如果入容器中包含了通过new操作创建的指针,切记在容器对象析构前将delete掉。第8条:切勿创建包含auto_ptr的容器对象。第9条:慎重选择删 阅读详情

相关推荐

Effective ModernC++ 条款32:使用初始化捕获来移动对象到闭包中

如果你要复制的对象复制开销非常高,但移动的成本却不高(例如标准库中的大多数容器),并且你希望的是宁愿移动该对象到闭包而不是复制它。表达式要多,但这并不难改变这样一个事实,即如果你希望使用一个C++11的类来支持其数据成员的移动初始化,那么你唯一要做的就是在键盘上多花点时间。这清楚地表明了,这个C++14的捕获概念是从C++11发展出来的的,在C++11中,无法捕获表达式的结果。这种移动构造是模仿移动捕获的关键,因为将右值移动到bind对象是我们解决无法将右值移动到C++11闭包中的方法。

cf18862344377的博客 713

【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

永远在使用对象之前先将它初始化。对于无任何成员的内置类型,你必须手工完成此事。至于内置类型以外的任何其他东西,初始化责任落在构造函数身上。规则很简单:确保每一个构造函数都将对象的每一个成员初始化。构造函数成员初始化列表: 这里有一个规则:总是在初始化列表中列出所有成员变量,即使有的成员变量是内置类型(内置类型的初始化和赋值成本相同)。成员初始化顺序 base classes 早于 derived

赚钱去看球 521

Effective Modern C++ 条款7:区别使用()和{}创建对象

它的语法能用于各种不同的上下文,它防止了隐式的变窄转换,而且对于C++最令人头疼的解析也天生免疫。取决于你看问题的角度,C++11对象初始化的语法可能会让你觉得丰富的让人难以选择,亦或是乱的一塌糊涂。(注:更灵活的设计——允许调用者决定从模板来的函数应该使用圆括号还是花括号——是有可能的。和构造函数重载的晦涩规则就会一下子涌进你的脑袋,你可能会想研究半天这些东西在你的日常编程中到底占多大比例。)来整合这些混乱且不适于所有情景的初始化语法,所谓统一初始化是指在任何涉及初始化的地方都使用单一的初始化语法。

cf18862344377的博客 971

读书笔记《Effective C++》条款04:确定对象被使用前已先被初始化

读取未初始化的值会导致不明确的行为。 在C语言中,全局变量和static变量一般会有初始化值,而对于局部变量没有定义初始化值。在C++中,有了class后,情况就更加复杂了。对于何时有初始化值,何时没有,记忆起来很复杂。最佳处理办法:永远在使用对象之前先将它初始化。对于无任何成员的内置类型,必须手动完成。至于内置类型以外的任何其他东西,初始化责任落在构造函数(constructors)身上。规则

Do-Program的专栏 347

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 761

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有:FairyGUI,VSCode代码环境涉及到了:LuaVSCode插件:EmmyLua在编写FairyGUI编辑器菜单前,了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能实现的,插件中我使用的是lua环境模板。导入编辑器的LuaAPI,文件可以在FairyGUI-Editor源码的插件目录中找到。接下来将通过功能来说明对应的API作用。

Aili_Xiao的博客 4497

[Effective C++读书笔记]004_条款04_确定对象被使用前已先被初始化

序言 看书是一件百味陈杂的事。看小说,心思专注时,你能从别人的故事里流出自己的眼泪;看历史,仰望星空时,你能从演变的沧海桑田里发现现实的美好。看技术书籍,自己编示例程序时,你能发现自己离大牛专家的距离有多远,有时简直是天壤之别,甚至感觉自己这辈子都无法企及那样的高度。然而,我们仍不能停下自己的脚步,因为身边的人都在往那个高度攀登着,因为高处的风景,至少,或许更加美好。 本文主题 ...

weixin_34279184的博客 93

PICO4 VR开发调试神器:用Live Preview Plugin实现电脑串流,告别反复打包烧录的繁琐流程

本文详细介绍了PICO4 VR开发中如何使用Live Preview Plugin实现电脑串流,显著提升开发效率。通过实时预览和调试功能,开发者可以避免反复打包烧录的繁琐流程,特别适用于Unity环境下的VR应用开发。文章涵盖环境配置、连接设置、实时调试技巧及性能优化方案,是PICO4开发者的必备指南。

weixin_34110970的博客 418

《Effective C++读书笔记》--条款04:确定对象被使用前已先被初始化

对于C++来说,定义一个值未初始化,其值是一个不确定的数,而当我们使用未初始化的值会导致UB,在不同的平台上表现不一样,总之会给程序带来不可预知的行为,我们要尽力避免。所以对于内置类型来说,我们要尽量在使用对象之前将他初始化,至于内置成员之外的类型,初始化的任务落在构造函数上,我们要确保每个构造函数将每个对象的每一个成员都初始化。此时有两种方法,一是在初始化列表中初始化,二是在构造函数中赋值。对此

WingC的博客 409

避开这些坑!QMT多因子策略实盘中的5个常见错误及解决方案

本文深入剖析了在QMT平台上实施多因子策略时常见的5个错误,包括因子过拟合、数据延迟处理不当、因子失效、交易成本低估和风险控制缺失,并提供了实用的解决方案。通过优化因子筛选、数据对齐和动态管理,帮助量化交易者提升策略稳健性和实盘表现。

k5l6m的博客 238

睿尔曼复合机器人之底盘操作流程

控制键”按下后,可在键盘上通过‘i’(向前),‘k’(向后),‘j’(向左旋转),‘l’(向右旋转)四个按键对底盘进行运动控制。选中禁⾏线功能后,使⽤⿏标在界⾯内点击选择起点,继续在其他地⽅点击,两点之间会连成⼀条线,可以进⾏多次连续点击,形成连续线条。4)扫图完成后,软件会重新启动,返回到监控页面,点击“激光”可看到当前机器激光扫描的实时数据,在页面上表现为红色边界线,点击菜单栏“控制”键使底盘在一定范围内运动,扫描到尽可能多的边界线,可发现与实际地图的黑色边界线不同,需要进行手动校正。

realman_Rop的博客 1474

读书笔记《Effective c++》 条款04 确定对象被使用前已经被初始化

a.对于内置类型,必须手工完成初始化,对于除此以外的东西,初始化的责任落在构造函数上。   (疑问:书上说如果在带参构造函数中给成员赋值而不是使用初始化列表的话,会首先调用default构造函数为成员设初始值,然后立刻对他们赋予新值,但在我只的测试代码中,default构造函数并没有被调用,这里我的理解是,可能并不是调用default构造函数,而是调用了和default构造函数相同的底层

木头刀 236

关于海康MVS软件显示速率低与1GB、相机丢包的设置优化

工控机主要应用与视觉检测!相机网线及工控机网口都是千兆的!设置完巨帧数和速度与双工(选择为全双工),显示速度低与1GB,不能够正常工作。C.LA-Properdes-Advanced-将RecerveBuffers更改为2048。E.LAN-属性-电源管理-取消选中允许计算机关闭此设备以保存电源。这种情况均为MVS设置不熟悉,可参照如下设置优化相应端口相机配置。D.局域网-属性-高级-将传输缓冲区更改为20484。B.LAN-属性-高级-将中断记录部分更改为执行。A.关闭采集控制帧速率控制。

米可的博客! 8821

Effective C++读书笔记之条款04:确定在使用对象前已将它初始化。

条款4:确定在使用对象前已将它初始化。(Make sure that objects are initialized before they’re used) 1.永远在使用对象之前将它初始化。 1.1 对于内置类型,手动完成初始化。 什么叫做内置类型呢?就是在C++里面的这些基本数据类型: ① 整数 int、short和long ② 字符型 char和wchar_t ③ 布尔型 bool ④ ...

Struggling_Jeff的博客 290

把 ABAP writable CDS view entity 讲透:从只读建模到可写模型的 ABAP CDS 新能力

摘要:SAP引入的writable CDS view entity突破了传统CDS视图只读的限制,允许通过ABAP SQL直接进行数据修改。该特性通过WRITABLE关键字定义,使CDS视图成为与数据库表同等级别的可写对象。其核心价值在于为数据集成、中间层同步等场景提供结构化写入入口,但需注意不应绕过业务规则。最佳实践建议保持底层表结构简单映射,避免复杂变形。这一特性标志着CDS从单纯消费模型向双向数据交互能力的演进,为ABAP开发提供了新的数据边界设计思路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1313

第1课:开篇扫盲——OpenClaw是什么?能帮你解决什么问题?(入门必看)

核心目标:学会安装、卸载、管理OpenClaw技能,自定义AI代理的性格与权限,让AI贴合自己的使用习惯。核心内容技能市场详解:ClawHub市场核心技能分类(办公、学习、开发、生活),热门技能推荐(web-search、文件处理、邮件管理)[superscript:3][superscript:4]。技能安装与卸载:终端命令实操(openclaw skill install/uninstall),技能更新与版本管理[superscript:3]。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1754

【读书笔记】Effective C++ 条款4:确定对象被使用前已先被初始化

如果。

m0_68617924的博客 419

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Effective C++读书笔记之确定对象被使用前已被初始化

为内置型对象进行手工初始化,因为c++不保证初始化它们。构造函数最好使用成员初值列(member initialization list ),而不要在构造函数本体内使用赋值操作(assignment )。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。

张小酒的博客 480

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Effective C++读书笔记(条款04:确定对象被使用前已被初始化)

永远在使用对象之前将它初始化。对于无任何成员的内置类型,你必须手功完成此事。 int x=0; //对int进行手工初始化 const char* text="A Cstyle string"; //对指针进行手工初始化 double d; std::cin >> d; //以读取input stream的方式完成初始化 ...

zhongh58的博客 471

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

Effective C++读书笔记 第1章

Ⅰ、 让自习惯C++ 条款01:视C++为一个语言连邦 C++是一个多重泛型编程语言,同时支持过程形式、面向对象形式、泛型形式、元编程形式的语言。 将C++是为一个联邦,主要的此语言为4个: procedural-based C。C语言的面向过程 Object-Oriented C++。面向对象 Template C++。 C++ 的泛型 (generics) 编程和由 template 的强大...

生命不息,代码不止 387

《Effective C++》读书笔记

effective C++读书笔记,持续更新中......

weixin_45654421的博客 261

Effective C++读书笔记(条款1-10)

条款1:视C++为一个语言联邦 #1.将C++ 分为四个次语言:C,Templete C++, Object-Oritented C++, STL; 条款2:尽量用 const, enum, inline 替换 #define #1用const替代#define。 理由1:预处理器移走了记号名称,导致记号名称没进入符号表,当发生编译错误时,你只能得到定义值,因此不知道错误来自何处。

指月的手指,成不了月亮,更得不到月亮!! 3526

Effective C++ 读书笔记(二)

所谓编译单元是指产出单一目标文件的那些源码,包括源码文件和其所包含的头文件。static对象是指其寿命是从被构造出来到程序结束为止。该对象包括global对象、namespace内的对象、文件内、class内、函数内被声明为static的对象。函数内的static对象称为local static对象,其他均为non-local static对象。

qq_53660404的博客 766
上一篇: Effective C++ 读书笔记 条款03:尽可能使用const
下一篇: Effective C++ 读书笔记 条款07:为多太基类声明virtual析构函数
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值