引用不支持一般意义的赋值运算,如何理解?
C++书上讲到容器的时候,说道引用不支持一般意义的赋值运算,如何理解?另外,为什么IO库类不支持赋值和复制?
[解决办法]
所谓“引用不支持一般意义的赋值运算”应该是用指针的观点去理解引用的说法。
考虑如下代码:
int a, b;
int &ri = a; //ri 引用a
ri = b;//ri不会引用b,而是把b的值赋值给a
int * pi = &a;//pi指向a
* pi = b;//这句是给a赋值
pi = &b;//pi改为指向b
int n = 10,m=11; //一般变量定义(非引用类型)
int &ref = n; //C++引用定义,引用必须初始化,初始化后被引用的对象,就会永远保持不变。
//C++中,ref只能引用n,不会再改为引用别的变量,比如m;
ref =m; //就是 n = m; 不是改为引用m;
// 引用不支持一般意义的赋值运算,如何理解?
//就是指的这种情况吧,把如果ref是指针,ref= &m;就会指向新对象了;
//不过这种解释很晦涩,更不好理解了。
//
//这里ref 没有更换引用的目标,还是引用的n,这个赋值操作和 n=m;效果一致
//其实就是 *(int *)&n =m;的意思;
//int n=10,m=11;
//int &ref = n;<==> int *const pref = &n; //ref 是 n的别名,就是 n的另一个名字
//ref =m; <==> *pref =m; <==> n=m;
//ref++; <==> (*pref)++; <==> n++;
//m =ref; <==> m = *pref; <==> m = n;
//ref +=m; <==> (*pref)+ m;
//下面是 引用的实现和概念的区别。
// 实现上,就是个指针常量,指针的值是被引用变量的地址;概念上是别名,是另一个变量的代表。
//&ref<==> pref 实现上,保存了被引用变量的地址<==> &n; 概念上,因为是同一个对象,所以地址相同。
//ref<==> *pref 实现上,引用值就是地址中的值<==> n; 概念上,因为是同一个对象,所以值也相同。
//概念上,语法上,理解引用,以及引用初始化,赋值,取地址。
int n=10,m=11;
int &ref =n; //ref:我就是n; n:我叫n,有时别人也叫我 ref,ref是我的外号(别名);
ref = m;//ref:我就是n,给我赋值就是给n 赋值; n:ref 就是我呀,给ref赋值就是 给我赋值呀。
ref++;//ref:我就是n,我自增就是n自增; n:ref 就是我呀,ref自增就是我自增呀。
m =ref;//ref:我就是n,我的值赋值给m,就是n的值赋值给m;
//n:ref 就是我呀,ref的值赋值给m,就是我的值赋值给m呀;
int *p =&ref;<==> int *p=&n;//ref:我就是n,我的地址就是n的地址;
//n:ref 就是我呀,ref的地址,就是我的地址;
#include<iostream>
using namespace std;
struct ref_struct{
ref_struct(int &n):ref(n){};//有兴趣的话,也可以在这里输出.
public:
int &ref;
}
int main()
{
int n=10;
ref_struct r(n);
cout<<"存储引用的地址="<<&r<<",引用的地址=" << &r.ref<<",被引用对象的地址"&n<<endl;
cout<<"引用的值="<<r.ref<<",被引用对象的值=" <<n<<endl;
return 0;
}