gpt4 book ai didi

c++ - 无法解释的行为 : round brackets without parameters in C++ primitives/objects initialization

转载 作者:行者123 更新时间:2023-11-30 03:35:55 25 4
gpt4 key购买 nike

在 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();
}

我有一个带有默认构造函数的类,我在其中放置了打印以强调它的调用,然后我声明了一个与前一个案例具有相似语法的对象,我期待对默认构造函数的调用,而我没有得到任何输出,所以没有调用构造函数。在下一次测试中,我尝试访问对象的成员,但出现错误“无法解析字段‘a’”。

我确信我的问题的答案是愚蠢和明显的,但现在我真的找不到它,所以感谢谁能帮助我。

最佳答案

j是一个函数,因为任何可以被解析为函数声明的东西都被解析为一个。

这通常被称为 C++ 的“最令人烦恼的解析”。

作为一个函数,它不会隐式转换为 void* (这是一个数据指针),但它确实转换为 bool ,并且它不为空,因此您得到逻辑 true,它显示为 1,因为这是 bool 的默认显示值(value)观。

即,你得到这个转换链:函数函数指针 bool 值(这是因为指针不为空)和 → 显示为 1 .

您可以使用 std::boolalpha 更改 bool 值的显示方式操纵器,如 cout << boolalpha; .然后代替 1你得到输出 true .我更喜欢这种模式。


您想要或需要指定默认初始化的一个简单解决方案是使用大括号:

int j{};

关于c++ - 无法解释的行为 : round brackets without parameters in C++ primitives/objects initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com