莫名其妙的行为:在 C++ primitives/objects 初始化中没有参数的圆括号
Inexplicable behaviour: round brackets without parameters in C++ primitives/objects initialization
在 C++ 中对对象和原语的初始化(和默认构造函数)进行了一些简单的尝试,我发现了一个我不理解的行为,所以我需要帮助。
我们先来谈谈基元类型。
我测试的代码如下:
int main() {
int i(5);
cout<<i<<endl;
int j();
cout<<j<<endl;
int k;
cout<<k<<endl;
return 0;
}
我得到的结果是这样的:
5
1
6487956
很明显我在关注第一个结果(对象样式的初始化),还有第三个(不是初始化值),但是第二个呢?关于第二个,我正在考虑默认初始化,而是收到一条警告,告诉 "the address of 'int j()' will always evaluate as 'true'"... 事实上打印结果是 1,但是原始变量附近的空圆括号是什么样的语法?
现在关于对象,情况类似...
代码是:
class Pluto {
public:
int a;
int b;
Pluto() {
a = 0;
b = 0;
std::cout<<"Constructor call"<<std::endl;
}
}
int main() {
Pluto p();
}
我有一个带有默认构造函数的 class,我在其中放置了打印以强调它的调用,然后我声明了一个与前一种情况具有相似语法的对象,我期待调用到默认构造函数,而我在输出中什么也得不到,所以没有调用构造函数。
在下一次测试中,我尝试访问对象的成员,但出现错误 "Field 'a' could not be resolved".
我确定我的问题的答案是愚蠢和明显的,但现在我真的找不到,所以感谢谁能帮助我。
j
是一个函数,因为任何可以被解析为函数声明的东西都被解析为一个。
这通常被称为 C++ 的“最令人烦恼的解析”。
作为一个函数,它不会隐式转换为 void*
(这是一个数据指针),但它会转换为 bool
,并且它不是空的,所以你得到合乎逻辑的 true,显示为 1,因为这是 bool
values.
的默认显示
即,你得到这个转换链:function → function pointer → boolean (这是 true 因为指针不为空)和 → 呈现为 1
.
您可以使用 std::boolalpha
操纵器更改布尔值的显示方式,例如 cout << boolalpha;
。然后你得到的不是 1
,而是输出 true
。我更喜欢这种模式。
您想要或需要指定默认初始化的一个简单解决方案是使用大括号:
int j{};
在 C++ 中对对象和原语的初始化(和默认构造函数)进行了一些简单的尝试,我发现了一个我不理解的行为,所以我需要帮助。
我们先来谈谈基元类型。
我测试的代码如下:
int main() {
int i(5);
cout<<i<<endl;
int j();
cout<<j<<endl;
int k;
cout<<k<<endl;
return 0;
}
我得到的结果是这样的:
5
1
6487956
很明显我在关注第一个结果(对象样式的初始化),还有第三个(不是初始化值),但是第二个呢?关于第二个,我正在考虑默认初始化,而是收到一条警告,告诉 "the address of 'int j()' will always evaluate as 'true'"... 事实上打印结果是 1,但是原始变量附近的空圆括号是什么样的语法?
现在关于对象,情况类似... 代码是:
class Pluto {
public:
int a;
int b;
Pluto() {
a = 0;
b = 0;
std::cout<<"Constructor call"<<std::endl;
}
}
int main() {
Pluto p();
}
我有一个带有默认构造函数的 class,我在其中放置了打印以强调它的调用,然后我声明了一个与前一种情况具有相似语法的对象,我期待调用到默认构造函数,而我在输出中什么也得不到,所以没有调用构造函数。 在下一次测试中,我尝试访问对象的成员,但出现错误 "Field 'a' could not be resolved".
我确定我的问题的答案是愚蠢和明显的,但现在我真的找不到,所以感谢谁能帮助我。
j
是一个函数,因为任何可以被解析为函数声明的东西都被解析为一个。
这通常被称为 C++ 的“最令人烦恼的解析”。
作为一个函数,它不会隐式转换为 void*
(这是一个数据指针),但它会转换为 bool
,并且它不是空的,所以你得到合乎逻辑的 true,显示为 1,因为这是 bool
values.
即,你得到这个转换链:function → function pointer → boolean (这是 true 因为指针不为空)和 → 呈现为 1
.
您可以使用 std::boolalpha
操纵器更改布尔值的显示方式,例如 cout << boolalpha;
。然后你得到的不是 1
,而是输出 true
。我更喜欢这种模式。
您想要或需要指定默认初始化的一个简单解决方案是使用大括号:
int j{};