Xiaolin Ma
maxiaolin0615
全部博文(80)
Video Codecs(0)
MPEG-4(1)
H.264(0)
NS2跨层设计(1)
视频流传输扩展及(4)
多接口多信道扩展(2)
NS2各层代码的理(9)
NS2调试及相关工(1)
NS2安装(0)
2012年(5)
2011年(12)
2010年(11)
2009年(52)
mudawei1
suanmeil
lanyanti
hggwm
lzj12345
Phyllis6
Bsolar
wmxcn200
running_
rainbows
西至1
分类: C/C++
2009-07-09 22:43:46
我能问一个问题吗?c++中对象数组的初始化用的是显示调用构造函数,在这个过程中生成了一个匿名对象,这个匿名对象是指什么?如果是构造函数为了初始化对象元素生成的,那也是应该调用拷贝初始化构造函数,为什么要调用构造函数? 请各位高手,帮我解决,
@草根 #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^ 因此,结论很明显:没有创建所谓的匿名对象。
十分对不起,好久没有上网了,没及时回复。 你说的那个匿名对象应该是指构造函数构造的一个临时对象。这个对象在表面是看不见的,使程序的内在机制。 上面的数组是生成十个数组的元素,而我们只给出三个来初始化,其他没有给出的就得调用默认的构造函数。并产生十个临时对象(我们在表面并不知道),然后把这十个对象分别付给数组元素。 我的理解是这样,不明白可以再看一下那本书。 我的那个例子是这样的: #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^
看了斑竹的文章,我学会了使用对象数组的初始化,不过我支持"草根“回复的内容。< 初始化对象数组的方案是: 首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后 将临时对象的内容复制到相应的元素中.因此,要创建类对象数组,则这个类必须有默认构造函数. 第一对象数组的初始化不一定要求它的类有默认构造函数; 第二初始化对象时并不是先调用默认构造函数,然后创建临时对象并用来初始化对象数组。初始化列表是直接指定了初始化对象的构造函数!!! 以下程序证明了我的观点,我去掉了默认构造函数,但程序依然正确运行。 书上写的不对! #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^ 回复 更多评论
@beginner1 我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而",要创建类对象数组,则这个类必须有默认构造函数"这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况. 而拷贝构造函数的调用大体情况有三: 一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时. 按理说上面的拷贝构造函数应该调用,有待进一步研究.........
上一篇:NS2中Mac802_11定时器介绍
下一篇:GNUPLOT使用技巧
登录 注册
# 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
我测试了一下,上面的有构造函数的初始化方法并没有调用构造函数,而",要创建类对象数组,则这个类必须有默认构造函数"这句话可能是书上只针对树上给的那个例子的情况__初始化的元素没有给全的情况.
而拷贝构造函数的调用大体情况有三:
一是用一个对象初始化另一个对象是;二是函数返回一个对象赋值时;三是对象作为函数参数值传递时.
按理说上面的拷贝构造函数应该调用,有待进一步研究.........