C ++构造函数初始化

时间:2013-07-07 09:37:23

标签: c++ reference constructor initialization-list

我有以下代码:

    struct Y {
        string& s1; //string s1; throws no error
        Y( string src ) : s1(src) { cout<<"s1: "<<s1<<endl; }
        void show(){ cout<<s1<<endl; }
    };

    int main()
    {
        Y y1("Krypton");
        y1.show(); //run-time error
    }

y1.show()应显示“Krypton”,但是我收到运行时错误(由于在调用y1.show()时s1未初始化?)。

Q1。为什么s1在构造函数初始化列表中已初始化时未初始化? Q2。如果我使用字符串s1,为什么我不会得到相同的错误;而不是参考?

非常感谢任何帮助。

此致

4 个答案:

答案 0 :(得分:1)

s1设置为引用src,它是一个临时对象,在构造函数存在时被销毁。

当您将s1作为字符串时,它是一个不依赖于src的本地副本

答案 1 :(得分:1)

您正在初始化临时引用。如果您希望struct Y的实例保存实际字符串而不仅仅是引用,则需要一个string类型的成员变量,而不是对string的引用。

  

Q1。为什么s1在构造函数初始化列表中已初始化时未初始化?

它已初始化,但是作为对不再存在的字符串的引用。

  

Q2。如果我使用字符串s1,为什么我不会得到相同的错误;而不是参考?

如果类包含字符串,则它不包含对存在的字符串的引用。

您认为该引用是什么字符串?

答案 2 :(得分:0)

因为您的构造函数Y(string src)接受了模板值,并且s1引用了此模板值,然后您调用show()打印值构造函数后该值为destroty。

答案:

1.因为引用的值s1在构造函数之后被破坏。

2.如果您使用string s1代替string& s1,请在调用构造函数时指定src yo s1,show()将打印成员 s1。

如果你想打“氪”,你可以将Y( string src )更改为Y( string& src )

答案 3 :(得分:0)

在您的情况下,您可以像这样初始化临时成员变量

struct Y 
{
    string& s1;

    Y( string& src )
        : s1(src)
    {
        cout<<"s1: "<<s1<<endl;
    }

    void show()
    {
        cout<<s1<<endl;
    }
};

int main()
{
    string s1_real = "Krypton";
    Y y1(s1_real);
    y1.show();

    return 0;
}

请注意

  1. 构造函数接受引用(字符串&amp; src不是字符串src)。因为如果使用“string src”,它将是一个临时变量,一旦函数堆栈展开并且s1最终成为悬空引用,它将被销毁。如果使用“string&amp; src”,则不会创建新的内存位置; src指向s1_real,因此s1最终指向s1_real。

  2. 您创建一个用于创建y1的变量(s1_real)。这是因为你不能引用临时变量(你只能使用const引用,在这种情况下,src和s1也必须声明为const引用)

  3. 请注意,y1的生命周期必须小于s1_real的生命周期,否则y1.s1最终会成为悬空参考