android object数组赋值_对象数组初始化的一种方法

# 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

我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而",要创建类对象数组,则这个类必须有默认构造函数"这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况.

而拷贝构造函数的调用大体情况有三:

一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时.

按理说上面的拷贝构造函数应该调用,有待进一步研究.........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值