C++中引用的影响

bas*_*sav 0 c++ reference

我正在阅读Scott Meyers的Effective C++并且遇到了这个问题.使用引用/指针的原因包含:

string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs refers to s1
rs = s2; //rs still refers to s1, but s1's value is now "Clancy".
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了这个:

string s1("Nancy");
string s2("Clancy");
string& rs = s1;
cout << rs << endl;
rs = s2;
cout << rs << endl;
cout << s1 << endl;
Run Code Online (Sandbox Code Playgroud)

输出见:

nancy
clancy
clancy
Run Code Online (Sandbox Code Playgroud)

这意味着s1的值现在已经改变了,s1的原始值永远丢失了?

这是区分引用和指针的事情之一然后??只有当你确定不打算在不同的时间引用不同的对象时才使用引用.

4pi*_*ie0 5

C++标准版n3337

§ 5.17 分配和复合赋值运算符

2)在简单赋值(=)中,表达式的值替换左操作数引用的对象的值.

(......)

6)当赋值运算符的左操作数表示对T的引用时,该操作分配给由引用表示的类型T的对象.

§ 8.5.3 参考

1)声明为T&或T &&的变量,即"对类型T的引用"(8.3.2),应由类型为T的对象或函数或可转换为对象的对象初始化.吨.(...)

2)初始化后,无法更改引用以引用其他对象.请注意,引用的初始化与赋值的处理方式非常不同.参数传递(5.2.2)和函数值返回(6.6.3)是初始化.

3)初始化程序只能在参数声明(8.3.5),函数返回类型的声明,类定义(9.2)中的类成员声明中以及extern说明符的引用中省略.明确使用.

您无法在C++ 1中重新初始化引用.您可以为其引用的对象指定不同的值.这是该参考文献永远的同一个对象.这就是你在你的例子中所做的.

string s1("Nancy")   // s1 Nancy
string s2("Clancy"); // s2 Clancy
string& rs = s1;     // rs-> s1
cout<<rs<<endl;      // ==cout s1
rs=s2;               // == s1=s2  
                     // s1 Clancy
                     // s2 Clancy
cout<<rs<<endl;      // ==cout s1
cout<<s1<<endl;
Run Code Online (Sandbox Code Playgroud)

这意味着s1的值现在已经改变了,s1的原始值永远丢失了?

是.

这是区分引用和指针之一的东西之一?

是.指针可以重新初始化,而引用则不能.这是这里指出的第一个区别

C++中指针变量和引用变量之间有什么区别?

何时使用引用与指针

仅在不重新初始化时才使用引用而不是指针?

当您想要始终指向同一对象时使用它们.如果它是类的成员并且您希望保留该类的有效对象始终包含对某些内容的引用的不变量,请使用它们.构造类实例时必须始终初始化引用成员,这样引用会强制您保留不变量.


1正如@James Kanze在评论中指出的那样,你无法在C++中重新初始化这个词的正确技术含义.在大多数情况下,初始化涉及构造函数,并且(ctor)在对象的生命周期开始时只被调用一次(在此上下文中,引用的初始化是特殊的,如 8.5.3/2 节所述,该引用通过传递参数来初始化或从函数返回的值).发生这种情况后,只有一个赋值,即调用T&operator =(T const&)