一、在创建对象时,是否有思考过以下两行代码为什么都会调用拷贝构造函数?
myclass mc_new(mc_old); //直接初始化
myclass mc_new = mc_old; //拷贝初始化
上面一行代码显然是调用了拷贝构造函数,是属于直接初始化。
而下面一行代码是属于拷贝初始化。当 = 用作定义对象时,= 会执行拷贝初始化允许编译器根据 = 右侧表达式的类型来选择最合适的构造函数来初始化对象。因此,由于 = 右侧是一个同类类型的对象,编译器将调用拷贝构造函数。
二、以转换构造函数举例
class myclass{
double value;
public:
myclass():value(0.0) {}
myclass(double t):value(t.value) {} //转换构造函数
...
}
int main(){
myclass mc_1(1.1); //直接初始化
myclass mc_2 = 2.2; //拷贝初始化
}
上面main函数中, 创建mc_1和mc_2的两行代码都调用了转换构造函数。
第二行创建mc_2的代码调用了拷贝初始化。 = 右侧表达式的类型是double,编译器则选择使用转换构造函数。