关于类的问题

nevil 2002-10-22 08:05:10
#include<iostream.h>
class A{
public:
A(){cout<<"1\n";}
};
class B{
public:
B(int i){cout<<i;}
A a;
};
int main(){
B b(7);
return 0;
}
这段小程序的结果是输出1 7,为什么是先调用class A构造函数,而不是先调用class B的构造函数初始化对象?
...全文
42 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuchong 2002-11-05
  • 打赏
  • 举报
回复
up,
ukyoking 2002-11-02
  • 打赏
  • 举报
回复
拜托各位看清楚先,人家不是派生的类。
类是在构造之前先产生数据成员的,a作为B类的数据成员当然是先被构造出来了
Last_Dodo 2002-11-01
  • 打赏
  • 举报
回复
Flamesong(天马行空):如果没有这个贴子为前提,我完全同意你的意见。但是作为程序员,你不必知道语言的详细内部结构和实现方法仍然可以成为优秀的程序员/软件工程师。对它的掌握可以加深你对语言的了解和良好运用,但成本太高。如果你的目标不只是成为优秀程序员而是想朝着语言研究方向发展,那么你必需系统地深入地认识它。
Flamesong 2002-11-01
  • 打赏
  • 举报
回复
不同意do_do(do_do)的说法,我们程序员就是在不停问为什么中进步的,就像高科学发明一样,没有创新就回老是跟在人家屁股后面跑,而创新就是靠不停的解决"为什么",提出自己的独道见解.
mashaowuxyz 2002-11-01
  • 打赏
  • 举报
回复
不定义确实可以生成一个对象,但这其实是调用了默认构造函数,数据成员被初始化为0,对于一个具体的对象来说,这可能是没有意义的!还有对象是由构造函数来创建并初始化的!
google_chu 2002-11-01
  • 打赏
  • 举报
回复
先分配给B一个对象空间,然后进行数据成员的定义,初始化,这样不就解决你的问题了么?
google_chu 2002-11-01
  • 打赏
  • 举报
回复
如果 你 不定义构造函数 不是一样也能生成一个对象
构造函数是用来初始化一个对象得吧?并不是用构造函数来生成对象的吧?不知道这样说对不对?要是对的话,你那个不难解释了对么?
muche 2002-10-30
  • 打赏
  • 举报
回复
因为A的对象a作为B的数据成员,在创建对象B时,调用B的构造函数创建对象时,首先初始化A的对象,再执行B的构造函数体!!
foolyz 2002-10-30
  • 打赏
  • 举报
回复
同意up的!
Last_Dodo 2002-10-29
  • 打赏
  • 举报
回复
大家的回答都是一般书本上找得到的。如果把问题稍稍改一下“可以先构造B再构造A吗?”或“为什么C++规定先构造A再构造B呢?”就不是那么简单的问题了。单单从对象的构造来说,先B后A一样可以。但会给继承(is_a关系)等其它方面的实现带来麻烦。这牵涉到Object Model的问题,对程序员来说记住“是什么”就行了不必理会“为什么”。
woxihuanbohe 2002-10-28
  • 打赏
  • 举报
回复
事实上
在《深度探索c++对象模型》那本书有很详细的解释!
这个问题没有涉及基类问题,为什么还有人提到子类构造函数调用基类构造函数的!?虽然说的不错,但是,呵呵,似户跟这个问题没多大联系吧!?
这仅仅是一个类的数据成员包含另外一个类的对象的问题!
正如kwok_1980(Mars) ,mashaowuxyz(飓风)所说,在类B构造函数不足以初始化它所有数据成员时,由编译器扩展了该构造函数的功能!
linuxsun999 2002-10-28
  • 打赏
  • 举报
回复
因为在类B中定义了A类的对象成员a,所以应先调用a所在类A的构造函数,然后才调用B类的构造函数.
fayekiss 2002-10-28
  • 打赏
  • 举报
回复
这是面向对像的特性C++会在你的构造函数调用之前给你的data member初始化。
kxw 2002-10-28
  • 打赏
  • 举报
回复
class B has-a class a object,如果要构造对象B,就要构造B中的数据成员,因为a 是B的成员,所以在B构造函数中隐式构建a,调用a的构造函数。
LinuxPanther 2002-10-26
  • 打赏
  • 举报
回复
构造函数是构造成员数据,要构造a就要调用a的构造函数
mashaowuxyz 2002-10-26
  • 打赏
  • 举报
回复
说说执行的内部过程!
定义B类对象,当然先调用B的构造函数(注意:调用并不意味着马上执行函数体内语句!),但这里面有分两个过程:1,分配B对象空间,即为B的数据成员a分配空间,这就意味着定义a,而a是一个对象,所以就要调用A的构造函数;2,控制返回B的构造函数,执行构造函数体!
就像kwok_1980(Mars)说的那样!写出
B(int i):a() //<----只是你没有写出来罢了.
就好理解了
jlqidan 2002-10-25
  • 打赏
  • 举报
回复
同意上面的
记住,构造函数是这样的顺序执行,先执行基类的构造函数,在*按声明顺序*执行类的对象成员的构造函数。
blue_coco 2002-10-23
  • 打赏
  • 举报
回复
C++中规定。在调用构造函数时,先调用基类的构造函数,
然后按照成员的申明顺序调用相应类的构造函数。
eg:
class A{
..
..

}

class B
{
..
..

}

class C
{
..
..

}

class D: public A
{
private:
B b;
C c;
..
..

}

类的构造函数调用顺序为A, B, C, D
没有为什么,C++中规定。
kwok_1980 2002-10-23
  • 打赏
  • 举报
回复
#include<iostream.h>
class A{
public:
A(){cout<<"1\n";}
};
class B{
public:
B(int i):a() //<----只是你没有写出来罢了.
{cout<<i;}
A a;
};
int main(){
B b(7);
return 0;
}
sea_lover 2002-10-23
  • 打赏
  • 举报
回复
我同意boyfling(流氓)有说法
加载更多回复(3)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧