# re: 对象数组初始化的一种方法
2006-12-24 10:32
草根
我能问一个问题吗?c++中对象数组的初始化用的是显示调用构造函数,在这个过程中生成了一个匿名对象,这个匿名对象是指什么?如果是构造函数为了初始化对象元素生成的,那也是应该调用拷贝初始化构造函数,为什么要调用构造函数?
请各位高手,帮我解决,
# re: 对象数组初始化的一种方法
2007-03-28 21:46
ahlongxp
@草根
#include using namespace std;
class foo
{
private:
int num;
public:
foo()
{
cout << "foo default constructing^" << endl;
}
foo(int a)
{
num = a;
cout << "foo constructing^ " << num << endl;
}
~foo()
{
cout << "foo desctructing^" << endl;
}
};
int main(int argc, char* [])
{
foo g[] = {foo(1),foo(2),foo()};
return 0;
}
该代码通过g++4.03编译后的运行结果是:
foo constructor^ 1
foo constructor^ 2
foo default constructor^
foo destructor^
foo destructor^
foo destructor^
因此,结论很明显:没有创建所谓的匿名对象。
# re: 对象数组初始化的一种方法
2007-04-09 14:19
静水流深
十分对不起,好久没有上网了,没及时回复。
你说的那个匿名对象应该是指构造函数构造的一个临时对象。这个对象在表面是看不见的,使程序的内在机制。
上面的数组是生成十个数组的元素,而我们只给出三个来初始化,其他没有给出的就得调用默认的构造函数。并产生十个临时对象(我们在表面并不知道),然后把这十个对象分别付给数组元素。 我的理解是这样,不明白可以再看一下那本书。
我的那个例子是这样的:
#include using namespace std;
class foo
{
private:
int num;
public:
foo()
{
cout << "foo default constructing^" << endl;
}
foo(int a)
{
num = a;
cout << "foo constructing^ " << num << endl;
}
~foo()
{
cout << "foo desctructing^" << endl;
}
};
int main(int argc, char* [])
{
int aNum = 5;
foo g[5] = {foo(1),foo(2),foo()};
return 0;
}
在VC6.0 下编译的结果为:
foo constructing^ 1
foo constructing^ 2
foo default constructing^
foo default constructing^
foo default constructing^
foo desctructing^
foo desctructing^
foo desctructing^
foo desctructing^
foo desctructing^
# re: 对象数组初始化的一种方法
2007-12-13 19:06
beginner1
看了斑竹的文章,我学会了使用对象数组的初始化,不过我支持"草根“回复的内容。
首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后
将临时对象的内容复制到相应的元素中.因此,要创建类对象数组,则这个类必须有默认构造函数.
第一对象数组的初始化不一定要求它的类有默认构造函数;
第二初始化对象时并不是先调用默认构造函数,然后创建临时对象并用来初始化对象数组。初始化列表是直接指定了初始化对象的构造函数!!!
以下程序证明了我的观点,我去掉了默认构造函数,但程序依然正确运行。
书上写的不对!
#include using namespace std;
class foo
{
private:
int num;
public:
/*foo()
{
cout << "foo default constructing^" << endl;
} */
foo(int a)
{
num = a;
cout << "foo constructing^ " << num << endl;
}
~foo()
{
cout << "foo desctructing^" << endl;
}
};
int main(int argc, char* [])
{
foo g[3] = {foo(1),foo(2),foo(3)};
return 0;
}
运行结果:
foo constructing^ 1
foo constructing^ 2
foo constructing^ 3
foo desctructing^
foo desctructing^
foo desctructing^
回复 更多评论
# re: 对象数组初始化的一种方法[未登录]
2007-12-19 12:21
静水流深
@beginner1
我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而",要创建类对象数组,则这个类必须有默认构造函数"这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况.
而拷贝构造函数的调用大体情况有三:
一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时.
按理说上面的拷贝构造函数应该调用,有待进一步研究.........