Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541855
  • 博文数量: 80
  • 博客积分: 3172
  • 博客等级: 中校
  • 技术积分: 773
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-15 11:35
文章存档

2012年(5)

2011年(12)

2010年(11)

2009年(52)

我的朋友

分类: C/C++

2009-07-09 22:43:46

对象数组初始化的一种方法

const int STKS = 10;
Stock stocks[STKS] = {
stock("NanoSmart", 12.5, 20),
stock(),
stock("Monolithic Obelisks", 130, 3.25),
};

     其中的一些对象是用默认构造函数初始化.
      初始化对象数组的方案是:首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后
将临时对象的内容复制到相应的元素中.因此,要创建类对象数组,则这个类必须有默认构造函数.

                                                                                          摘自<>(第五版)

# re: 对象数组初始化的一种方法 2006-12-24 10:32

我能问一个问题吗?c++中对象数组的初始化用的是显示调用构造函数,在这个过程中生成了一个匿名对象,这个匿名对象是指什么?如果是构造函数为了初始化对象元素生成的,那也是应该调用拷贝初始化构造函数,为什么要调用构造函数?
请各位高手,帮我解决,

# re: 对象数组初始化的一种方法 2007-03-28 21:46

@草根

#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

看了斑竹的文章,我学会了使用对象数组的初始化,不过我支持"草根“回复的内容。< 初始化对象数组的方案是:
首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后
将临时对象的内容复制到相应的元素中.因此,要创建类对象数组,则这个类必须有默认构造函数.
第一对象数组的初始化不一定要求它的类有默认构造函数;
第二初始化对象时并不是先调用默认构造函数,然后创建临时对象并用来初始化对象数组。初始化列表是直接指定了初始化对象的构造函数!!!
以下程序证明了我的观点,我去掉了默认构造函数,但程序依然正确运行。
书上写的不对!
#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
我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而",要创建类对象数组,则这个类必须有默认构造函数"这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况.

而拷贝构造函数的调用大体情况有三:
一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时.
按理说上面的拷贝构造函数应该调用,有待进一步研究.........    

阅读(3101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~