c++ - 请教默认构造函数调用自定义构造函数的问题
PHP中文网
PHP中文网 2017-04-17 11:18:02
[C++讨论组]

先看一段简单的代码吧:

#include <iostream>
using namespace std;

struct CLS
{
  int m_i;
  CLS( int i ) : m_i(i) {}

  CLS()
  {
    CLS(2);
  }
};

int main(int argc, char *argv[])
{
  CLS obj1;
  cout << obj1.m_i << endl;

  CLS *obj2 = new CLS();
  cout << obj2->m_i << endl;
  delete obj2;

  return 0;
}

上面代码的输出结果是:

-1220312074
0
  1. 显然,我预期的输出结果是2,但不管是在栈上构造对象还是在堆上构造对象,结果都不是我们想要的。
    这是什么原因呢?
  2. CLS obj1; 为什么不能写成 CLS obj1();
  3. 为什么自动分配的对象和new的对象会输出不同的结果?
PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(2)
PHP中文网

1、你在构造函数中调用了另一个构造函数,实际上只是创建了一个匿名的临时变量!而不是像你想象中的那样!
2、如果写成CLS obj1();那就是一个函数声明!
3、你在构造函数中没有显式对成员变量进行初始化或者赋值,所以m_i的结果是未定义的!

天蓬老师

1. 这才是符合你预期的写法,至于你的写法为什么是错的,原因是因为你写错了,详见各种入门书籍。

  CLS(): CLS(2)
  {

  }

2. 因为有歧义,至于具体为什么不能这么写,因为这是规定。

leunggamciu 回复jollywing: 因为有歧义!这样就没问题:CLS obj1 = CLS();

3. 这是未定义行为,不同的编译器有不同的结果。至于为什么是未定义行为,个人猜测是为了保证可移植性。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号