1.缺省情况下, 用一个类的对象初始化另一个对象, 或者向该类另一个对象赋值, 都由缺省的按成员语义(default memberwise semantics)支持
在某些情况下, 对类的安全性和处理正确性是不够的, 需要类设计者提供特殊的拷贝构造函数(copy constructor)和拷贝赋值操作符(copy assignment
operator)的定义
2.new类对象 --只有new表达式成功的申请到空间内存, 构造函数才会被调用
3.构造函数定义为inline时, 创建对象是会在调用点展开构造函数
4.成员初始化列表(member initialization list)
5.构造函数不能用const或volatile关键字来声明
一个const类对象在"从其构造函数完成到析构函数开始"这段时间内才被认为是const, volatile类对象也一样
6.explicit修饰符通知编译器不要提供隐式转换
void print(const CTest &test);
//...
print("oops"); //这种调用会把"oops"转换成一个CTest对象
缺省情况下, 单参数构造函数(或者有多个参数, 除了第一个参数外, 其他都有缺省实参)被用作转换符
无意的隐式类转换, 是很难跟踪的错误!, 关键字explicit被引入到标准c++中, 以帮助我们抑制这种不受欢迎的编译辅助行为
explicit只能被应用在构造函数上
7.缺省构造函数是不需要用户指定实参就能够被调用的构造函数, --并不意味着它不能接受实参, 只意味着构造函数的每个参数都有一个缺省值与之关联
8.限制对象创建 --把相关构造函数放到非公有访问区内, 从而限制或显示禁止某些形式的对创建动作
在实际的c++程序中, 非公有的构造函数主要用处是:
防止用一个类对象想该类另一个对象做拷贝
指出只有当一个类在继承层次中被用作基类, 而不能直接被应用程序操纵时, 构造函数才能被调用
9.拷贝构造函数 --用一个类对象初始化该类的另一个对象被称为缺省按成员初始化(default memberwise initialization)
一个类对象想该类的另一个对象作拷贝是通过依次拷贝每个非静态数据成员来实现
类设计者可以通过提供特殊的拷贝构造函数(copy constructor)来改变缺省的行为
拷贝构造函数不一定是const, 但它却必须是引用
10.无论何时, 当在一个函数内删除一个独立的堆对象时, 最好使用auto_ptr类对象而不是一个实际的指针
如果delete表达式失败, 如一个异常被抛出, 会到时内存泄露(异常抛出, 跳过了delete操作?), 不会调用析构函数
所以建议用auto_ptr智能指针
11.对于在堆中分配的类对象数组的元素, 我们没有办法提供一组显示的值来做初始化, 如果细化支持通过new表达式分配数组, 则类必须提供一个缺省的构
造函数, 或不提供构造函数
12.用一个类对象初始化另一个类对象, 称为按成员初始化(default memberwise initialization)
发生在 用一个类对象显示的初始化另一个对象
把一个类对象作为实参传递给一个函数
把一个类对象作为一个函数的返回值传递回来
非空顺序容器类型的定义
把一个类对象插入到一个容器类型中
13.成员类对象初始化
14.缺省按成员赋值(default memberwise assignment) --用一个类对象向该类的另一个对象的赋值操作
用隐式的拷贝赋值操作符
一般来所, 如果缺省的按成员初始化对于一个类不合适, 则缺省的按成员赋值也不合适
通过提供一个现实的拷贝赋值操作符的实例, 可以改变缺省的按成员赋值
注意要防止一个类对象向自己赋值 --对于"先释放与该对象当前相关的资源, 以便分配与被拷贝对象相关资源"这样的拷贝赋值操作符, 拷贝自身尤其不
合适
当一个类对象被赋值给该类的另一个对象是:
a检查该类, 判断是否提供了一个现实的拷贝赋值操作符
b如果是, 检查访问权限, 判断是否可以被调用
c如果不能被调用, 编译错误, 否则执行这个调用
d如果该类没有提供显示的拷贝赋值操作符, 则执行按缺省成员赋值
e在缺省按成员赋值下, 每个内置类型或复合类型的数据成员被赋值给相应的成员
f对于每个类成员对象, 递归执行a到f步, 知道所有内置或复合类型的数据成员都被赋值
如果希望完全禁止按成员拷贝的行文, 将操作符声明为private并且不提供实际定义即可
一般来说, 应该将拷贝构造函数和拷贝赋值操作视为一个个体单元
15.C++语言不能有效地返回一个类对象, 这被视为c++语言的一个重大缺陷
16.c++类对象的初始化总是比赋值更有效