BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29277同步于 2009/9/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

弱问一下:一个c结构体的问题

huahua1860
2009/9/29镜像同步8 回复
struct CLS{ int m_i; CLS(int i):m_i(i) { } CLS() { CLS(0); } }; CLS obj; cout<<obj.m_i<<endl; 输出是什么呢?为什么是一个不确定的数呢?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
jmpesp机器人#1 · 2009/9/29
CLS() { CLS(0); //会导致产生一个临时对象 }
AHbupt机器人#2 · 2009/9/29
【 在 huahua1860 的大作中提到: 】 : struct CLS{ : int m_i; : CLS(int i):m_i(i) : ................... 呵呵 在默认构造函数内部调用带参数的构造函数是用户行为不是编译器行为,只会执行函数调用不会执行其后的初始化表达式,也就是说m_i(i)不会执行 所以不会输出你预想的值
AHbupt机器人#3 · 2009/9/29
【 在 AHbupt 的大作中提到: 】 : 呵呵 在默认构造函数内部调用带参数的构造函数是用户行为不是编译器行为,只会执行函数调用不会执行其后的初始化表达式,也就是说m_i(i)不会执行 所以不会输出你预想的值 ps:ms是primer里面就讲了吧
jmpesp机器人#4 · 2009/9/29
【 在 AHbupt 的大作中提到: 】 : 呵呵 在默认构造函数内部调用带参数的构造函数是用户行为不是编译器行为,只会执行函数调用不会执行其后的初始化表达式,也就是说m_i(i)不会执行 所以不会输出你预想的值 这个跟用户行为和编译器行为应该关系不大。 产生这样的结果的根本的根本原因是产生了一个临时对象。 CLS() { CLS(0); //产生了一个临时对象。 } 其实,定义一个类似有参数初始化的构造函数 CLS(int i):m_i(i) {} 在实现中,m_i(i)是当做CLS(int i)的内部语句来实现的,也就是等价于: CLS(int i) { m_i = i; } 也就是说,不管是编译器行为还是用户行为进行该构造的调用都会对m_i 进行初始化。 那为什么lz的例子的结果会有疑问呢?答案就在临时对象产生了,所以CLS(0)是对临时对象的m_i进行初始化而不是对原来的那个对象初始化,所以导致原来对象的m_i未进行初始化。 这些结论是在vc上面总结的。gcc我没总结,有机会我再调试下。
rebirthatsix机器人#5 · 2009/9/29
楼上正解,m_i应该是初始化了,但是初始化的根本不是这个对象的m_i
AHbupt机器人#6 · 2009/9/29
【 在 jmpesp 的大作中提到: 】 : 这个跟用户行为和编译器行为应该关系不大。 : 产生这样的结果的根本的根本原因是产生了一个临时对象。 : CLS() : ................... 恩 产生临时对象是肯定的 跟踪了下m_i(i)也是执行了,看来书上有误 ps:要是外部的构造和内部的构造在一个内存上是可以输出的 :new (this)CLS(0); 或者干脆使用this指针调用CLS(0)
ImageP机器人#7 · 2009/9/29
牛人不少啊!
qupel机器人#8 · 2009/9/29
fdfsfsf