如何初始化参数化构造函数的对象数组
我需要初始化参数化构造函数的对象数组。我怎样才能以最好的方式做到这一点?如何初始化参数化构造函数的对象数组
# include<iostream>
# include<conio.h>
# include<stdio.h>
using namespace std;
class A
{
public:
int a;
A();
A(int x)
{
a=x;
}
};
int main()
{
A *a1,a2(1);
a1 = (A*)malloc(sizeof(A)*10); // equivalent to A[10].
for(int i=0;i<10;i++) a1[i]=a2; // Initialization is important in any program.
for(int i=0;i<10;i++) cout<<a1[i].a;
getch();
return 0;
}
这是行得通的,但有没有其他方式比这更好?
C++的方式将是使用一个std ::向量。
std::vector<A> a1(10, 1);
创建了由1
初始化10 A
的。
这需要A(int)不是显式的,我认为? – 2012-02-14 18:24:59
可能,但它不在示例中。 – 2012-02-14 18:25:49
当然,想要确定,因为我想回答同样的事情,但认为可能有些坏事:) – 2012-02-14 18:27:51
这是通过使用标准::矢量构造器服用的尺寸和底座元件解决:
A a2(1);
std::vector<A> tab(10, a2);
请注意,malloc
不构建对象,所以调用a1[i]=a2
是不好的形式。它可能似乎工作正常,因为他们是POD ish对象,但这不是做C++的正确方法。这是未定义的行为,这是完全不可预测的。它可能连续运行一万次,然后清除您的银行帐户。您应该使用new
来代替,其中也是构造。或者更好的是,使用一个向量,就像其他答案所建议的那样。另外,确保默认的构造函数初始化数据,并且初始化不会太担心。
如果你真的必须使用malloc, “正确的方式” 来初始化是这样的:
std::uninitialized_copy(a1, a1+10, a2); //constructs and assigns
这大致相当于:
{
int i=0;
try {
for(i=0; i<10; ++i)
new(a1+i)A(a2); //constructs and initializes in the buffer
} catch(...) {
try {
for(; i>=0; --i)
(a1+i)->~A(); //destroy if an error occured
} catch(...) {
std::terminate();
}
throw;
}
}
我不希望'A(int)构造函数抛出或默认的拷贝构造函数 – 2012-02-14 18:35:30
@BoPersson:true,但是当他再次用'std :: string'来做这件事时,他惊讶于他的程序崩溃了?我会教普通的正确(并且简单!办法。 – 2012-02-14 18:38:26
“*,我很确定它是未定义的行为*”它绝对是。 – ildjarn 2012-02-14 19:44:06
为什么C'S'malloc'和'残培()'而不是C++的'new'并使用iostream? – Cameron 2012-02-14 18:24:13
“*这是工作*”不,它不;它调用UB并且只有_appears_才能工作。 – ildjarn 2012-02-14 19:42:30
@ildjarn你是什么意思,它只调用UB?我没有明白UB的意思。 – Invictus 2012-02-14 19:45:18