一段代码,几个疑问,大家看看。

seaman117 2005-03-15 10:47:47
#include <iostream.h>
class A{
int a;
public:
A(int x):a(x) { cout<<a; }
~A( ) { cout<<a; }
};
class B: A{
int b, c;
const int d;
A x, y;
public:
B(int v): b(v),y(b+2),x(b+1),d(b),A(v) {
c=v;
cout<<b<<c<<d;
cout<<'C';
}
~B( ) { cout<<'D'; }
};
void main(void) { B z(1); }

问题一:b(v)的意思是否是b=v?为什么要这么写?
问题二:B z(1)对象后,是否是依次构造数据b,d,x,y为什么不是按B(int v)后的顺序构造呢?
问题三:b,c我觉得构造了两次,对否?
...全文
251 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhange000 2005-03-19
  • 打赏
  • 举报
回复
最后的输出结果为:
1 2 3 1 1 1 C D 3 2 1;
zhange000 2005-03-19
  • 打赏
  • 举报
回复
我就第二个问题的回答:
   问题二:B z(1)对象后,是否是依次构造数据b,d,x,y为什么不是按B(int v)后的顺序构造呢?    不是按照此后 面的参数来构造的;
    它是按照先基类A构造函数,再是派生类的字对象类的构造函数;
最后是派生类B的构造函数.
所以正确的构造数据是,先A(v),而后x(b+1),y(b+2),
最后是b(v),c=v,d(v);
当然了很明显的b,c只构造了一次;


seaman117 2005-03-17
  • 打赏
  • 举报
回复
大家写写输出结果看看?
haocn 2005-03-16
  • 打赏
  • 举报
回复
冒号使常量和引用类型的成员变量的初始化成为可能
zhousqy 2005-03-16
  • 打赏
  • 举报
回复
B(int v): b(v),y(b+2),x(b+1),d(b),A(v)
=====================
最好按聲明的順序初始化
zhousqy 2005-03-16
  • 打赏
  • 举报
回复
问题一:b(v)的意思是否是b=v?为什么要这么写?
==============
这是构造函数初始化列表的形式
guyaguya 2005-03-16
  • 打赏
  • 举报
回复
问题一:b(v)的意思是否是b=v?为什么要这么写?

问题二:B z(1)对象后,是否是依次构造数据b,d,x,y为什么不是按B(int v)后的顺序构造呢?
///////////////////////////////////////////////////////////
这两个问题effective c++中解释的比较清楚
Item12,Item13
你要是没有我可以发给你一个电子版的
dongpy 2005-03-16
  • 打赏
  • 举报
回复
问题一:b(v)的意思是否是b=v?为什么要这么写?
===================================================
因为b是内建类型,所以b(v)所作的操作就是b=v。这种写法是用于自定义类型的,可以减少开销。对于

内建类型没什么意义。


问题二:B z(1)对象后,是否是依次构造数据b,d,x,y为什么不是按B(int v)后的顺序构造呢?
=========================================
构造数据的顺序是根据在类里声明的次序来定。

如果按B(int v)后的顺序构造,那么初始化列表顺序改变,构造顺序也要改变,这样编译器的工作就比

较重。


问题三:b,c我觉得构造了两次,对否?
======================
任何成员变量都只有构造一次,即初始化一次。
seaman117 2005-03-16
  • 打赏
  • 举报
回复
to guyaguya(GUYAGUYA) :
那就发一个了,多谢!seaman117@21cn.com
seaman117 2005-03-15
  • 打赏
  • 举报
回复
问题三的意思是楼上说的。

刚从c转过来的看着类试int b(5)这样的就是有点不习惯,知道是重载的意思,但总觉得的像一个函数。
B(int v): b(v),y(b+2),x(b+1),d(b),A(v)中的那个:是什么运算符?这一段是怎么执行的?

to zhangfjj(小张(张三的张,不小的小)) :
对象类型的数据成员也可以放到函数体内赋值吧, B(int v): b(v),y(b+2),x(b+1),d(b),A(v) {
c=v; //这里不就是吗?
cout<<b<<c<<d;
cout<<'C';
}
GeminiXXXCC 2005-03-15
  • 打赏
  • 举报
回复
一起学习了,我觉得
一的两种方法是一样,只不过b(v)似乎更像面对对象(就像调用了构造函数一样)
二类的数据的初始化顺序只和声明他们的顺序有关,和具体实现的顺序无关。
三应该是赋值了2次,毕竟int只能算是内部数据,不能说构造吧?
不对的地方希望大家指出。
zhangfjj 2005-03-15
  • 打赏
  • 举报
回复
问题一:b(v)的意思是否是b=v?为什么要这么写?
对,这是构造函数初始化列表的形式,对类的对象成员进行初始化。
对于简单类型的数据成员可以放到函数里面去,但对对象类型的数据成员必须放在这里。

问题二:B z(1)对象后,是否是依次构造数据b,d,x,y为什么不是按B(int v)后的顺序构造呢?
是依据类B中数据成员定义的顺序而不是在初始化列表中的顺序初始化

问题三:b,c我觉得构造了两次,对否?


你怎么认为构造了2次?
星空Neo 2005-03-15
  • 打赏
  • 举报
回复
第一个问题就是你所想的
数据的初始化是按定义的顺序
b,c没构造两次
在构造函数中只是对它们进行赋值

64,637

社区成员

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

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