在C ++中对对象和基元的初始化(和默认构造函数)做了一些简单的尝试,我发现了一个我不理解的行为,所以我需要帮助。
让我们先谈谈基元类型。
我测试的代码如下:
int main() {
int i(5);
cout<<i<<endl;
int j();
cout<<j<<endl;
int k;
cout<<k<<endl;
return 0;
}
我得到的结果是:
5
1
6487956
显然我是在考虑第一个结果(在对象样式中初始化),还有第三个(未初始化的值),但是第二个?关于第二个,我正在考虑默认初始化,而是我得到一个警告,告诉“'int j()'的地址将始终评估为'true'”...实际上打印结果是1,但是什么样的sintax是原始变量附近的空圆括号吗?
现在关于这个对象,情况类似...... 代码是:
class Pluto {
public:
int a;
int b;
Pluto() {
a = 0;
b = 0;
std::cout<<"Constructor call"<<std::endl;
}
}
int main() {
Pluto p();
}
我有一个带有默认构造函数的类,我在其中放置一个print来强调其调用,然后我声明一个与前一个案例类似的sintax的对象,我期待调用默认构造函数,而输出中没有任何内容,因此没有调用构造函数。 在下一个测试中,我尝试访问对象的成员,但是我收到错误“Field'a'无法解析”。
我确信我的问题的答案是愚蠢和明显的,但现在我真的找不到它,所以多亏谁会帮助我。
答案 0 :(得分:2)
j
是一个函数,因为任何可以解析为函数声明的东西都被解析为一个函数。
这通常被称为C ++的“最令人烦恼的解析”。
作为一个函数,它不会隐式转换为void*
(这是一个数据指针),但它确实转换为bool
,并且它不是null,所以你得到逻辑 true ,显示为1,因为这是bool
值的默认显示。
即,你得到这个转换链:功能→功能指针→布尔(这是 true 因为指针不为空)和→表示为1
。
您可以使用std::boolalpha
操纵器更改布尔值的显示,例如cout << boolalpha;
。然后代替1
,您获得输出true
。我更喜欢这种模式。
您希望或需要指定默认初始化的简单解决方案是使用花括号:
int j{};