类对象的构造
再次阅读与总结C++程序设计语言,依然能够引发深刻的思考与再思考~~~
=======================================================================================
考虑建立对象(特别是类对象)的各种不同方式,以及它们在后来怎么销毁。一个对象可以通过如下方式建立:
- 一个命名的自动对象,当程序的执行每次遇到它的声明时建立,每次程序离开它所出现的块时销毁;
- 一个自由存储对象,通过new运算符建立,通过delete运算符销毁;
- 一个非静态成员对象,作为另一个类对象的成员,在它作为成员的那个对象建立或者销毁时,它也随之被建立或销毁;
- 一个数组元素,在它作为元素的那个数组被建立或销毁时建立或销毁;
- 一个局部静态对象,在程序执行中第一次遇见它的声明时建立一次,在程序终止时销毁一次;
- 一个全局对象、名字空间的对象、类的静态对象,它们只在“程序开始时”建立一次,在程序终止时建立一次;
- 一个临时对象,作为表达式求值的一部分被建立,在它所出现的那个完整表达式的最后被销毁;
- 一个在分配操作中由所提供的参数控制,在通过用户提供的函数获得的存储里放置的对象;
- 一个union成员,它不能有构造函数和析构函数
面向对象 --- 类 忠告
- 用类表示概念
- 只将public数据(struct)用在它实际上仅仅是数据,而且对于这些数据成员并不存在不变式的地方;
- 一个具体类型属于最简单的类。如果适用的话,就应该尽可能使用具体类型,而不要采用更复杂的类,也不要使用简单的数据结构;
- 只将那些需要直接访问类的表示的函数作为成员函数;
- 采用名字空间,使类与其协助函数之间的关系更明确;
- 将那些不修改对象值的成员函数做成const成员函数;
- 将那些需要访问类的表示,但无需针对特定对象调用的成员函数做成static成员函数;
- 通过构造函数建立起类的不变式;
- 如果构造函数申请某种资源,析构函数就应该释放这一资源;
- 如果在一个类里有指针成员,它就需要有复制操作(包括复制构造函数和复制赋值);
- 如果一个类里有引用成员,它就可能需要有复制操作(复制构造函数和复制赋值);
- 如果一个类需要复制操作或析构函数,它多半还有构造函数、析构函数、复制赋值和复制构造函数;
- 在复制赋值里需要检查自我赋值;
- 在写复制构造函数时,请小心的复制每个需要复制的元素(当心默认的初始式);
- 在向某个类中添加新成员时,一定要仔细检查,看是否存在需要更新的用户定义构造函数,以使它能够初始化新成员;
- 在类声明里需要定义整型常量时,请使用枚举;
- 在构造全局的和名字空间的对象时,应避免顺序依赖性;
- 用第一次开关去缓和顺序依赖性问题;
- 请记住,临时对象将在建立它们的那个完整表达式结束时销毁。