Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将参数传递给基类构造函数时成员的初始化_C++_Inheritance_Initialization - Fatal编程技术网

C++ 将参数传递给基类构造函数时成员的初始化

C++ 将参数传递给基类构造函数时成员的初始化,c++,inheritance,initialization,C++,Inheritance,Initialization,在下面的代码中,我在创建基类时为未初始化的类成员赋值。为什么这不会导致运行时错误 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 <<

在下面的代码中,我在创建基类时为未初始化的类成员赋值。为什么这不会导致运行时错误

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(s = f()) {}
s
对象尚未正确创建。因为
Foo()
的构造函数调用尚未完成。基本上,它处于未定义状态。因此,任何行为都是未定义的。 但此代码行为并非未定义:

Bar() : Foo(/*anything*/) {
        s = f();
    } 
因为构造函数调用已完成


注意:我在msvc11中测试了f()执行时未初始化的类栏,因此成员“a”没有值。有趣的是,此代码在VisualStudio2008中运行,但无论如何,这样做都不安全


Razvan。

基类和类成员按声明顺序初始化(虚拟基类不同):

  • 基类(第一个)按声明顺序排列(例如类X:A、B、C}
  • 按声明顺序排列的成员(例如int a;int b;int c;)
构造函数中初始化的顺序不会改变它

在您的情况下,Foo未初始化,因此BAR和它的成员-未定义行为(S在分配给它时有一些垃圾数据)。< /P> < P>运行时错误:在分配给未初始化成员时没有“运行时错误”。C++中“未初始化”状态在运行时是不可检测的,这就是为什么它不可能以任何确定的方式处理(如“运行时错误”)


当您这样做时,您的代码会显示未定义的行为。这种未定义的行为将表现为不可预测的行为。它很容易对完全无关的因素敏感,例如在类中声明另一个成员。这就是它的全部内容。

真正的问题是:为什么要这样做?欢迎使用未定义的行为haviour land,任何事情都有可能发生!:)@AlexEx这是未定义的行为。你什么都不确定
Bar() : Foo(/*anything*/) {
        s = f();
    }