我有以下代码:
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,为什么我不会得到相同的错误;而不是参考?
非常感谢任何帮助。
此致
杰
答案 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;
}
请注意
构造函数接受引用(字符串&amp; src不是字符串src)。因为如果使用“string src”,它将是一个临时变量,一旦函数堆栈展开并且s1最终成为悬空引用,它将被销毁。如果使用“string&amp; src”,则不会创建新的内存位置; src指向s1_real,因此s1最终指向s1_real。
您创建一个用于创建y1的变量(s1_real)。这是因为你不能引用临时变量(你只能使用const引用,在这种情况下,src和s1也必须声明为const引用)
请注意,y1的生命周期必须小于s1_real的生命周期,否则y1.s1最终会成为悬空参考