左值与右值引用

  1 /*左值与右值*/
  2 
  3 #include<iostream>
  4 #include<stdio.h>
  5 
  6 // 左值就是可以放在赋值号左边被赋值的值,必须在内存有实体
  7 // 右值就是可以放在赋值号右边取出值赋给其他变量的值
  8 // 右值可以在内存也可以在寄存器
  9 
 10 void main()
 11 {
 12     int a = 5;
 13     int b;
 14     std::cout << &a << &b << std::endl;
 15     int b = a+1;// a,b在内存  a+1 ,a+3 寄存器中
 16     b = a+3;
 17 }
 18 
 19 //----------------------------------------------------
 20 
 21 /*左值引用*/
 22 
 23 #include<iostream>
 24 
 25 void main()
 26 {
 27     int a = 5;
 28 //    int &ra = a;
 29     int & ra(a);// 引用初始化  引用必须初始化
 30     ra = 3;
 31     std::cout << a << std::endl;
 32 
 33 }
 34 
 35 //----------------------------------------------------
 36 
 37 void change(int &a) // 新建一个变量接受实际参数的值
 38 {
 39     a = 19;
 40 }
 41 
 42 void main()
 43 {
 44     int a = 10;
 45     change(a);
 46     std::cout << "main a = " << a << std::endl;
 47 }
 48 
 49 //----------------------------------------------------
 50 
 51 void main()
 52 {
 53     int num1(5);
 54     int num2(10);
 55     int *pnum(&num1);
 56     int* &rpnum = pnum;
 57 
 58     //rpnum = &num2; 引用可以改变指针的指向
 59     *rpnum = 100; // 引用还可以改变指向的值
 60 
 61     std::cout << *pnum << std::endl;
 62     std::cout << num1 << std::endl;
 63 }
 64 
 65 //----------------------------------------------------
 66 
 67 // 改变外部变量需要地址或者引用
 68 //只有左值引用是用指针实现的
 69 void main()
 70 {
 71     int num1(5);
 72     int num2(10);
 73     int * &&p = &num1;// 引用右值
 74     int *p = rpnum// 用于对象拷贝
 75 }
 76 
 77 //----------------------------------------------------
 78 
 79 /*返回一个引用*/
 80 
 81 // 栈上
 82 int & get()
 83 {
 84     int a =10;// a在栈上
 85     int & ra = a;
 86     return ra;
 87 }
 88 
 89 void main()
 90 {
 91     int & ra = get();
 92 
 93     std::cout << ra << std::endl; 
 94 
 95     std::cout << " ABCDE" << std::endl;
 96     
 97     std::cout << ra << std::endl; 
 98 }
 99 
100 //-----------------------------------------------
101 
102 /*返回一个堆上的引用*/
103 
104 // 堆上
105 int * & getdata()
106 {
107     int *p;// 栈上  野指针  木有初始化
108 
109     std::cout << &p << std::endl;
110 
111     p = new int ;// new 分配内存 等价于C中的malloc  堆上内存
112 
113     *p = 10;// 堆上内存
114     int * &rp = p;//引用指针
115     return rp;//返回引用的指针
116 }
117 
118 void main()
119 {
120     int * &rp = getdata();
121 
122     int *p = rp;
123 
124     std::cout << *rp << std::endl;
125 
126     std::cout << *p << std::endl;
127 
128     std::cout << *rp << std::endl;
129     
130     std::cout << *p << std::endl;
131 
132     std::cout << p << std::endl;
133     delete(p); // C++删除内存以后 禁止访问 指针的值会发生变化
134     
135     std::cout << p << std::endl;
136     std::cout << *p << std::endl;
137 }
138 
139 //----------------------------------------------------
140 
141 void main()
142 {
143     int a =10;// a在栈上
144     int & ra = a;// & 是左值引用
145     int * && pa = &a;// && 是右值引用
146 }

 

posted on 2015-05-27 09:34  Dragon-wuxl  阅读(93)  评论(0)    收藏  举报

导航