上善若静水

while(effort=true){success++;}

   :: 首页 :: 联系 :: 聚合  :: 管理
  9 Posts :: 10 Stories :: 11 Comments :: 0 Trackbacks

留言簿(1)

搜索

  •  

积分与排名

  • 积分 - 41912
  • 排名 - 516

最新随笔

最新评论

阅读排行榜

评论排行榜

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

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

                                                                                          摘自<<C++ Primer Plus>>(第五版)
posted on 2006-09-24 22:06 上善若静水 阅读(15370) 评论(5)  编辑 收藏 引用 所属分类: 知识点滴

Feedback

# re: 对象数组初始化的一种方法 2006-12-24 10:32 草根
我能问一个问题吗?c++中对象数组的初始化用的是显示调用构造函数,在这个过程中生成了一个匿名对象,这个匿名对象是指什么?如果是构造函数为了初始化对象元素生成的,那也是应该调用拷贝初始化构造函数,为什么要调用构造函数?
请各位高手,帮我解决,  回复  更多评论
  

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

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

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


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理