免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2380 | 回复: 10
打印 上一主题 下一主题

构造函数调用问题。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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的带参构造函数调用没有生效么??

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-06-20 22:55 |只看该作者

回复 #1 maxxfire 的帖子

这不是java……

论坛徽章:
0
3 [报告]
发表于 2009-06-20 22:57 |只看该作者
原帖由 OwnWaterloo 于 2009-6-20 22:55 发表
这不是java……


啥意思大侠,不大明白。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 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 没有影响。
}


这问题前段时间也有帖子里说过,  忘记标题了。

论坛徽章:
0
5 [报告]
发表于 2009-06-20 23:08 |只看该作者
原帖由 OwnWaterloo 于 2009-6-20 23:02 发表
class Base
{
public:
    Base() : a(1) {Base(2);}
...


哦,这样,有点奇怪,,呵呵~

论坛徽章:
0
6 [报告]
发表于 2009-06-21 09:14 |只看该作者
我改造了一下,还是有点不解:
class Base
{
public:
    Base(){ a=1; Base(2);}
    Base(int k){ a=k; }
    int a;
};

即使不采取成员列表的方式初始化,Base(int)还是无效,这样子就有点说不过去了

论坛徽章:
0
7 [报告]
发表于 2009-06-21 09:25 |只看该作者
Base(){ a=1; Base(2);}
a=1操作的是Base对象的成员
而Base(2)不过是又构造了一个Base对象,上面的a并不在这个Base对象里

论坛徽章:
0
8 [报告]
发表于 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);}

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
9 [报告]
发表于 2009-06-21 09:50 |只看该作者
原帖由 maxxfire 于 2009-6-21 09:33 发表



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

好晦涩

论坛徽章:
0
10 [报告]
发表于 2009-06-21 13:28 |只看该作者
原帖由 maxxfire 于 2009-6-20 17:33 发表



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


不是很好,不过可以试试 new (this) Base(2);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP