Chinaunix

标题: 构造函数调用问题。。 [打印本页]

作者: maxxfire    时间: 2009-06-20 22:27
标题: 构造函数调用问题。。
class Base
{
public:
    Base() : a(1) {Base(2);}
    Base(int k) : a(k) {}
    int a;
};

class Extend : public Base
{
public:
    Extend(){};
    Extend(int a):Base(a){ }
};

int main()
{
    Extend m1(3);
    Extend m2;
    cout<<m1.a<<","<<m2.a<<endl;
}



奇怪这个程序怎么输出了:
3,1

为什么不是3,2
Base的带参构造函数调用没有生效么??
作者: OwnWaterloo    时间: 2009-06-20 22:55
标题: 回复 #1 maxxfire 的帖子
这不是java……
作者: maxxfire    时间: 2009-06-20 22:57
原帖由 OwnWaterloo 于 2009-6-20 22:55 发表
这不是java……


啥意思大侠,不大明白。。
作者: OwnWaterloo    时间: 2009-06-20 23:02
标题: 回复 #3 maxxfire 的帖子
class Base
{
public:
    Base() : a(1) {Base(2);}
...

java里面是

class Base
{
public:
    Base() { Super(2); }
...

这样的???   可能是我记错了, 只是有点像。


C++中, 父类和成员的构造是在初始化列表中, 进入函数体时已经构造完毕了。
Base() : a(1) /* this->a已经构造为1 */{
/* 所有父类和成员构造完毕 */
    Base(2);  // 调用Base的一个构造函数重载 Base(int); 生成一个临时对象。
    // 对this->a 没有影响。
}


这问题前段时间也有帖子里说过,  忘记标题了。
作者: maxxfire    时间: 2009-06-20 23:08
原帖由 OwnWaterloo 于 2009-6-20 23:02 发表
class Base
{
public:
    Base() : a(1) {Base(2);}
...


哦,这样,有点奇怪,,呵呵~
作者: maxxfire    时间: 2009-06-21 09:14
我改造了一下,还是有点不解:
class Base
{
public:
    Base(){ a=1; Base(2);}
    Base(int k){ a=k; }
    int a;
};

即使不采取成员列表的方式初始化,Base(int)还是无效,这样子就有点说不过去了
作者: felixzxh    时间: 2009-06-21 09:25
Base(){ a=1; Base(2);}
a=1操作的是Base对象的成员
而Base(2)不过是又构造了一个Base对象,上面的a并不在这个Base对象里
作者: maxxfire    时间: 2009-06-21 09:33
原帖由 felixzxh 于 2009-6-21 09:25 发表
Base(){ a=1; Base(2);}
a=1操作的是Base对象的成员
而Base(2)不过是又构造了一个Base对象,上面的a并不在这个Base对象里



多谢多谢,原来这样,看来构造函数果然名符其实,调用它就会构造一个对象出来。。哈哈。。
终于这样才能生效:
Base(){ a=1; *this=Base(2);}
作者: phy0077    时间: 2009-06-21 09:50
原帖由 maxxfire 于 2009-6-21 09:33 发表



多谢多谢,原来这样,看来构造函数果然名符其实,调用它就会构造一个对象出来。。哈哈。。
终于这样才能生效:
Base(){ a=1; *this=Base(2);}

好晦涩
作者: emacsnw    时间: 2009-06-21 13:28
原帖由 maxxfire 于 2009-6-20 17:33 发表



多谢多谢,原来这样,看来构造函数果然名符其实,调用它就会构造一个对象出来。。哈哈。。
终于这样才能生效:
Base(){ a=1; *this=Base(2);}


不是很好,不过可以试试 new (this) Base(2);
作者: talktan    时间: 2009-06-21 18:53
原帖由 maxxfire 于 2009-6-21 09:33 发表



多谢多谢,原来这样,看来构造函数果然名符其实,调用它就会构造一个对象出来。。哈哈。。
终于这样才能生效:
Base(){ a=1; *this=Base(2);}


我觉得这样是越走越远了,如果没有重载过=算符的话,*this=Base(2)是按位拷贝,效果是达到了,但实在是绕了个大弯。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2