在下面的代码中,我将在创建基类时为未初始化的类成员分配一个值。为什么这没有引起运行时错误?

class Foo {
public:
    Foo(std::string) {}
};

class Bar : public Foo {
public:
    Bar() : Foo(s = f()) {} // assigning to uninitialized class member

    void print() {
        std::cout << s << std::endl;
    }
    std::string f() {
        return "Some string";
    }

private:
    std::string s;
};

int main()
{
    Bar b;
    b.print();
    return 0;
}


但是将另一个成员添加到Bar类会在创建Foo类时产生错误:

Class Bar {

// same as above

private:
    std::string s;
    int a;        // adding another member
};


为什么会这样?

最佳答案

“运行时错误”?分配给未初始化的成员时没有“运行时错误”。在C ++中,在运行时无法检测到“未初始化”状态,这就是为什么无法以任何确定性方式(例如“运行时错误”)对其进行处理的原因。

当您执行类似的操作时,您的代码会显示未定义的行为。这种不确定的行为会消失,这本身是不可预测的。它很容易对完全不相关的因素敏感,例如在类中声明另一个成员。这里的所有都是它的。

10-01 17:57
查看更多