难以理解的行为:C ++原语/对象初始化

时间:2016-12-03 10:55:11

标签: c++ constructor initialization default brackets

在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'无法解析”。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

即,你得到这个转换链:功能功能指针布尔(这是 true 因为指针不为空)和→表示为1

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

您希望或需要指定默认初始化的简单解决方案是使用花括号:

int j{};