C ++中引用的影响

时间:2015-01-25 16:04:18

标签: 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".

所以,我试过这个:

string s1("Nancy");
string s2("Clancy");
string& rs = s1;
cout << rs << endl;
rs = s2;
cout << rs << endl;
cout << s1 << endl;

看到输出:

nancy
clancy
clancy

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

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

2 个答案:

答案 0 :(得分:5)

  

C ++标准版n3337

     

§ 5.17 作业和复合作业运算符

     

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

     

(...)

     

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

     

§ 8.5.3 参考文献

     

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

的对象      

2)之后不能更改引用以引用另一个对象   初始化。请注意,处理引用的初始化   与赋值完全不同。论证传递(5.2.2)和   函数值return(6.6.3)是初始化。

     

3)初始化器可以省略,仅供参数参考   声明(8.3.5),在函数返回类型的声明中,in   在类定义(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;
  

这意味着s1的值现在已更改且s1的原始值为   永远失去了??

  

这是区分引用与指针的区别之一   然后?

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

What are the differences between a pointer variable and a reference variable in C++?

When to use references vs. pointers

  

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

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


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

答案 1 :(得分:0)

以简单而简短的方式回答您的问题.... s1 ”的原始值是“丢失“真的改变了。 为什么? 创建引用变量时,您将创建一个将另一个变量作为别名的变量。该引用变量将保留别名变量的地址。这就像有一个指针。 R.变量将始终指向A.变量。但是,指针与R.Variable之间的区别在于,对于以不同方式取消引用的指针,使用R.Variable,您将它们视为正常变量,其次是对于R.Variable,您不做任何特殊的操作。解决它的记忆,就像在指针中那样。

int AliasV = 70;
int& RefeV = AliasV;

cout<<RefeV <<" "<< AliasV;

//Now RefeV is addressing to AliasV memory. (Similar to Pointer but no equal)

RefeV = 100;

//Because RefeV is addressing to AliasV memory, AliasV now has as value 100
cout<<RefeV<<" "<<AliasV;

输出:

70 70
100 100

提示:

  • 请记住,RefeVariable将始终在后台处理其别名内存。
  • 对RefeVariable的任何更改都会影响其别名。