先看一段简单的代码吧:
#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
CLS obj1;
为什么不能写成 CLS obj1();
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1、你在构造函数中调用了另一个构造函数,实际上只是创建了一个匿名的临时变量!而不是像你想象中的那样!
2、如果写成CLS obj1();那就是一个函数声明!
3、你在构造函数中没有显式对成员变量进行初始化或者赋值,所以m_i的结果是未定义的!
1. 这才是符合你预期的写法,至于你的写法为什么是错的,原因是因为你写错了,详见各种入门书籍。
2. 因为有歧义,至于具体为什么不能这么写,因为这是规定。
3. 这是未定义行为,不同的编译器有不同的结果。至于为什么是未定义行为,个人猜测是为了保证可移植性。