我有一个课可以说aClass
class aClass
{
public:
int data;
aClass(): data(-1) { //default constructor
}
aClass(int x): data(x) { //int constructor
};
如果我创建一个类似
的数组aClass* arr=new aClass[10];
问题1:
我原以为没有aClass
对象被创建,因为它只是一个数组的声明,但在我测试的程序中看起来像arr[0]
到arr[9]
所有指向{{1}的aClass
1}}在其类中由默认构造函数创建的对象?因为我测试了该程序,结果是a[0].data=-1
一直到a[9].data=-1
。
问题2:如果使用默认构造函数创建对象,我应该如何创建一个包含int构造函数创建的对象的数组?显然我不能写像
这样的代码aClass* arr=new aClass(2015)[10];
答案 0 :(得分:3)
问题1:我认为没有创建aClass对象,因为它只是一个数组的声明
你错了。这是一个指针的声明,它使用new aClass[10]
的返回值进行初始化,构造一个包含10个对象的数组。
但在我测试过的程序中看起来像arr [0]到arr [9]所有指向由其类中的默认构造函数创建的aClass对象?
是的,你的观察是正确的。
问题2:如果使用默认构造函数创建对象,我应该如何创建一个包含由int构造函数创建的对象的数组?
从c ++ 11开始,你可以使用列表初始化:aClass *foo = new aClass[3]{1, 2, 3};
作为注释中的chris指示。
您可能想要使用std :: vector。有std::vector::vector(size_type n, const value_type& val)
用于构建副本,因为c ++ 11:std::vector::vector(initializer_list<value_type>)
用于不同的值。
使用静态/自动数组,即使在c ++ 11之前也可以进行聚合初始化:
aClass foo[3] = { 1, 2, 3 };
答案 1 :(得分:1)
而不是aClass* arr=new aClass(2015)[10];
如果你的编译器支持它,你可以aClass *arr = new aClass[10]{2015, 2015/*etc*/};
。
在C ++ 11中,这两者意味着相同的事情。
aClass *arr = new aClass[10];
aClass *arr = new aClass[10]{};
更好的选择是使用std::vector
并避免使用原始指针而是使用智能指针ex。 std::unique_ptr
。
此替代方案的示例可以是:
int main()
{
vector<unique_ptr<aClass>> vec;
for (int i{0}; i != 10; ++i)
vec.emplace_back(new aClass(2015));
for (auto const& i : vec) // print data
cout << i->data << endl;
return 0;
}
答案 2 :(得分:0)
关于问题1. initialization的规则非常严格。数组new[]
表达式创建一个值数组。必须初始化这些值,默认情况下它们使用default initialization。
问题2的答案是你不能用动态数组做到这一点。但是,std::vector
确实提供了一个构造函数,允许您提供将被复制到每个包含元素的对象。请参阅explicit vector(size_type count, const T& value = T(), const Allocator& alloc = Allocator())
。
如果希望集合中的每个元素不同,则必须使用循环并单独分配元素,除非静态确定数组的大小,在这种情况下可以使用初始化表达式。如果要避免动态容器的初始默认构造,则不应按值存储对象。你应该使用一个指针容器或更好的容器智能指针。然后,您可以对每个对象使用直接初始化。
答案 3 :(得分:0)
如果要在不创建对象的情况下创建数组,则需要创建指针数组。例如,aClass** arr = new aClass*[10];
创建一个指针数组。当您想要创建实际对象时,您需要执行以下操作:arr[0] = new aClass(2015);