C++ 复制构造函数解决方法

C++ 复制构造函数假定我定义了一个类Class Fractal,并且其具有Fractal(int n)构造函数我们这样定义数组: F

C++ 复制构造函数
假定我定义了一个类Class Fractal,并且其具有Fractal(int n)构造函数
我们这样定义数组: Fractal arr[] = {Fractal(0),Fractal(1),Fractal(2)};
问题是这里为什么没有调用Fractal的复制构造函数。(编译器vc6.0 vc2005都这样)
个人理解: 数组定义时,先调用Fractal(int)生成临时对象,在调用复制构造函数对Fractal数组进行初始化,现在唯一能解释通的就是编译器进行了优化
//不要告诉我替换方案Fractal arr[] = {0,1,2}; 我就是对上面定义不太理解,大神赐教


[解决办法]
你理解是对的,临时对象被优化掉了
[解决办法]
我想,C++的标准并没有规定数组的生成过程到底是怎样的。所以,也就不一定是你理解的方式。不同的编译器,处理过程并不完全一样,甚至同一个编译器,不同的编译选项也会导致不一样的行为。例如:

Fractal arr[] = {Fractal(0),Fractal(1),Fractal(2)};
既可被编译器中间转换成:
一、拷贝函数式
Fractal tmp1(0);
Fractal tmp2(1);
Fractal tmp3(2);
Fractal* arr = operator new (sizeof(Fractal) * 3);
arr[0] = tmp1;
arr[1] = tmp2;
arr[2] = tmp3;

二、复制构造函数式
Fractal tmp1(0);
Fractal tmp2(1);
Fractal tmp3(2);
Fractal* arr = operator new (sizeof(Fractal) * 3);
Fractal::Fractal(tmp1, &arr[0]);
Fractal::Fractal(tmp2, &arr[1]);
Fractal::Fractal(tmp3, &arr[2]);

三、直接构造式
Fractal* arr = operator new (sizeof(Fractal) * 3);
Fractal::Fracal(0, &arr[0]);
Fractal::Fracal(1, &arr[1]);
Fractal::Fracal(2, &arr[2]);

三种方式都能完成数组的创建,只是效率有差别而已。