左值与右值引用
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) 收藏 举报
浙公网安备 33010602011771号