`
tibaloga
  • 浏览: 868491 次
文章分类
社区版块
存档分类
最新评论

确定对象在被使用前被初始化(Make sure that objects are initialized before they’re used)——effective c++学习笔记

 
阅读更多

永远在对象是使用之前初始化它。

不要混淆了成员变量的赋值和初始化的区别:

对于对象的非内置类型(intchar等)成员,他们的初始化动作时发生在构造函数本体之前。在构造函数中,这些成员是被复制,而不是被初始化。初始化发生在这些成员的default构造函数被调用之时。但是对于内置类型成员不能保证也是如此的。

我们可以在构造函数前加入member initialization list(成员初值列表)替换复制动作:

class Number

{

private:

Explicit _e;

Explicit _e2;

public :

Number(int i)

:_e2(5),

_e(i)

{

printf("Number 构造函数./n");

}

virtual

~Number( )

{

printf("Number 析构函数./n");

}

};

如果不加成员初值列表,相当于成员向初始化,然后马上赋值,这样前面的初始化就相当于白费了。

对于内置类型成员,它赋值和初始化的成本相同,最好也通过初始化列表来实现,这样可以保持统一。

注意:必须在初值成员列表中初始化所有的成员。

如果成员过多,且类有多个构造函数,则初值成员列表可能会过程,造成代码重复。 可以适当的将内置成员单独拎出来放在一个统一的函数中实现。总之,真正的初始化比伪初始化通常更可取。

注:成员的构造函数早于类的构造函数,而析构函数晚于类的析构函数。

注:成员初始化顺序总是和成员声明的顺序相同,而和初值成员列表的顺序无关。

注意:

<!--[if !supportLists]-->1、 <!--[endif]-->为内置对象手动初始化,因为c++不保证初始化他们。

<!--[if !supportLists]-->2、 <!--[endif]-->构造函数最好使用成员初值列,而不要在构造函数中使用赋值操作。初值列中成员的顺序,应该和他们在class中声明的顺序一样。

<!--[if !supportLists]-->3、 <!--[endif]-->为避免“跨编译单元值初始化次序”问题,请以local static对象代替non-local static对象。

分享到:
评论

相关推荐

    Effective C++(第三版)

    make sure that objects are initialized before they're used. 2. 构造/析构/赋值运算 constructors, destructors, and assignment operators 条款05:了解c++ 默默编写并调用哪些函数 know what functions c++ ...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    It is important to know that functions are not always inlined even if they are declared as such; for example, virtual and recursive functions are not normally inlined. Usually recursive functions ...

    C++ 中const总结

    C++ 中const总结 const 限定符把一个对象转换成一个常量,如 const int bufSize=512; 申 明 bufSize 的时候,如果不将它初始化,那么编译器会报错:const object must be initialized if not extern。因为 bufSize ...

    acpi控制笔记本风扇转速

    structures in this header are always compiled as aligned. The ACPI_OPERAND_OBJECT has been manually optimized to be aligned and will not work if it is byte-packed. Example Code and Data Size: These ...

    SteamVR Plugin

    Unity3D添加SteamVR Plugin包即可实现测试Unit VR效果。下载完成之后,在Project中直接点击import package即可

    2009 达内Unix学习笔记

    文件名以“.”开头的都是隐藏文件/目录,只需在文件/目录名前加“.”就可隐藏它。 ~/ 表示主目录。 ./ 当前目录(一个点)。 ../ 上一级目录(两个点)。 ; 多个命令一起用。 &gt; &gt;&gt; 输出重定向 。将一个命令的...

    八皇后问题C++中的面向对象编程

    C++面向对象编程八皇后问题 BOOL CMyqueenApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your ...

    java基础非常典型的面试题目.wps

    如果编译器能够确认一个局部变量在使用之前可能没有被初始化,编译器将报错。 如果局部变量没有被初始化,并且在方法中一直没有被使用,编译和运行都会通过。 可以改正为:String s = null ;

    spring-boot-db-initialization-test:测试用例,显示未初始化数据库以进行测试的错误

    spring-boot-db初始化测试 测试用例,显示未初始化数据库以进行测试的错误 该项目包含一个测试,该测试查询内存中的h2数据库以确保其不为空 $ mvn test ... 2014-10-14 10:10:21.409 WARN 3435 --- [ main] o.s.b.a....

    Consistent Labeling of Tracked Objects in Multiple Cameras with Overlapping Fields of View

    In this paper, we address the issue of tracking moving objects in an environment covered by multiple uncalibrated cameras with overlapping fields of view, typical of most surveillance setups. In such ...

    操作系统(内存管理)

    在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...

    lazy-property:对象属性的延迟初始化

    向对象添加延迟初始化的属性。 例子 var addLazyProperty = require ( "lazy-property" ) var obj = { } addLazyProperty ( obj , "foo" , function ( ) { console . log ( "initialized!" ) return "bar" } ) //...

    内存管理内存管理内存管理

    调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此,malloc 返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 ...

    ARM 44b0 初始化源代码

    Fill zeros into zero-initialized C-variables * ;******************************************************** GET ..\inc\option.inc GET ..\inc\memcfg.inc ;*********************************************...

    Bloodshed Dev-C++

    * Editor colors are initialized properly on Dev-C++ first-run * Added doxygen-style comments in NewClass, NewMemberFunction and NewMemberVariable wizards * Added file's date/time stamp in File/...

    设计模式C++代码示例-含VC工程

    C++设计模式代码: (VC工程) Creational Patterns Abstract Factory Creates an instance of several families of classes Builder Separates object construction from its representation Factory Method ...

    python实现BP神经网络回归预测模型,使用BP神经网络的实现手写数字识别,一万字报告

    Although BP neural network performs well in handwritten numeral recognition, it can not be ignored that the weights and thresholds of BP neural network are initialized randomly, which is easy to lead ...

    解决Delphi DBX和MySQL连接的噩梦:DBX Error: Driver could not be properly initialized.

    Delphi DBX和MySQL连接的发生DBX错误:无法正确初始化驱动。(DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, ...),我找到了合适的libmysql.dll和...

    图像处理程序大全 C++

    本资源含大量的图像处理代码(C++) int kind = 0; // 图像类型(8位kind=1,24位kind=3,初始化kind=0) LONG Bytes = 0; // 图像分配内存的最大值 BOOL Step; // 菜单上一步、下一步启动禁用标志 -&gt; FALSE为下...

    光盘刻录大师crt not initialized修复文件

    完美修复光盘刻录大师报crt not initialized的错误 使用方法:将文件覆盖到安装目录即可 解压密码:17

Global site tag (gtag.js) - Google Analytics