首先说明,如果可以使用vector则直接用vector的构造函数就可以在创建对象的时候用自定义的构造函数,若非得使用new创建对象数组才有这个初始化问题。
new使用默认构造函数创建对象数组和创建基本数据类型数组的方法一样:
int *p1 = new int[10];
A * ap = new A[10];
看到另一个博主说在new创建对象数组的时候不能使用自定义的构造函数对每个元素进行初始化,只能用默认构造函数。
这个结论是错误的
事实上在C++11有了列表初始化之后new创建对象数组也可以使用自定义的构造函数进行初始化了,方法和基本数据类型也一样。
int *p1 = new int[10]{1,2,3,4,5,6,7,8,9,10};
A * ap = new A[10]{1,2,3,4,5,6,7,8,9,10};
实例如下:
#include <iostream>
using namespace std;
class A{
private:
int data;
public:
A(){}
A(int x):data(x){}
A(const A& a){this->data=a.data;}
void print(){cout<<data<<endl;}
};
int main()
{
int *x = new int[10]{1,2,3,4,5,6,7,8,9,10};
A * ap = new A[10]{1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<10;++i) {
(ap+i)->print();
cout<<"!!"<<x[i]<<endl;
}
delete []x;
delete []ap;
return 0;
}
结果如图: 但是要注意,如果这里给我们的拷贝构造函数改成explicit,会导致无法运行并报错:
error: no matching function for call to 'A::A(A)'|
若去掉explicit或者直接使用默认生成的拷贝构造函数却可以正常运行。
可能是内部使用了隐式转换?欢迎大佬指点解答。
|