引用高级
1 /* 引用高级 */
2
3 /* 引用一维数组 */
4 #include<iostream>
5 #include<stdlib.h>
6
7 void main()
8 {
9 int a[10] = {1,2,3,4,5,6,7,8,9,10};
10 int(& ra)[10](a);// 引用一维数组 引用就是给原来的变量取一个别名 同一个地址
11 int i = 0;
12 for (auto data : ra )
13 {
14 data = i + 5;
15 std::cout << data << std::endl;
16 }
17 std::cout << a << " " << ra << std::endl;
18 std::cout << &a << " " << &ra << std::endl;
19
20 system("pause");
21 }
22
23
24 //----------------------------------------------------
25
26 /* 引用二维数组 */
27
28 void main()
29 {
30 int a[2][5] = {1,2,3,4,5,6,7,8,9,10};
31 int(&ra)[2][5](a);// 引用二维数组
32
33 for (int i=0; i<2; i++)
34 {
35 for (int j=0; j<5; j++)
36 {
37 std::cout << " " << ra[i][j];
38 }
39 std::cout << std::endl;
40 }
41 std::cout << a << " " << ra << std::endl;
42 std::cout << &a << " " << &ra << std::endl;
43
44 system("pause");
45 }
46
47 /* 引用一个函数指针 */
48
49 int jia(int a,int b)
50 {
51 return a+b;
52 }
53
54 int jian(int a,int b)
55 {
56 return a-b;
57 }
58
59 void main()
60 {
61 int (*p)(int a,int b)(jia);
62 std::cout << p(1,2) << std::endl;
63
64 int (* &rp)(int a,int b)(p);// 引用一个函数指针
65 rp = jian;// (),仅仅适用于初始化
66 std::cout << p(1,2) << std::endl;
67 }
68
69 //----------------------------------------------------
70
71 int jian(int a,int b)
72 {
73 return a-b;
74 }
75
76 void change(int(* & rp)(int,int))// 引用函数指针当作函数的参数
77 {
78 rp = jian;
79 }
80
81
82
83 void main()
84 {
85 int (*p)(int a,int b)(jia);
86 std::cout << p(1,2) << std::endl;
87
88 //int (* &rp)(int a,int b)(p);// 引用一个函数指针
89 //rp = jian;// (),仅仅适用于初始化
90 change(p);
91 std::cout << p(1,2) << std::endl;
92 }
93
94 //----------------------------------------------------
95
96 /* 返回值是一个函数指针 */
97 int(*& changep(int(* & rp)(int,int)) )(int ,int ) // 函数指针当作函数的参数
98 {
99 rp = jian;
100 return rp;
101 }
102
103 void main()
104 {
105 int (*p)(int a,int b)(jia);
106 std::cout << p(1,2) << std::endl;
107
108 p = changep(p);
109
110 std::cout << p(1,2) << std::endl;
111 }
112
113 //----------------------------------------------------
114
115 /* 复杂引用 */
116
117
118 void main()
119 {
120 //int *p[4];
121 int a=1,b=2,c=3;
122 int *px[3] = {&a,&b,&c}
123 //int &p[4]={a,b,c};不可以
124 // 引用数组是非法的
125 }
126
127 //----------------------------------------------------
128
129 struct mystr
130 {
131 int a;
132 int b;
133 // 代码区的函数不计入结构体的sizeof
134 void go()// 函数在代码区 函数区是公用的
135 {
136 std::cout << "123456789" << std::endl;
137 }
138 };
139
140
141 class MyClass
142 {
143 int a;
144 int b;
145 double h;
146 };
147
148 void main()
149 {
150 int num = 10;
151 int & rnum(num);
152 double db = 10.9;
153 double & rdb(db);// 直接作用引用的变量
154
155 std::cout << sizeof(rnum) << std::endl;
156
157 std::cout << sizeof(rdb) << std::endl;
158
159 std::cout << sizeof(mystr) << std::endl;
160
161 std::cout << sizeof(MyClass) << std::endl;
162 }
163
164 //----------------------------------------------------
165
166 /* 右值引用 */
167
168 int getdata(int && num)// 右值引用可以节约内存拷贝 内存优化所必需的
169 {
170 std::cout << num << std::endl;
171 num+=10;
172 return num;
173 }
174
175 void main()
176 {
177 int a = 5;
178 int b = 4;
179 std::cout << getdata(a+1) << std::endl;
180 }
1 /* 左值右值的转换 */
2
3 //左值 一般可以取地址就是左值
4 //右值 某些情况可以取地址有些情况不可以
5
6
7 int getdata(int && num)// 右值引用可以节约内存拷贝 内存优化所必需的
8 {
9 std::cout << num << std::endl;
10 num+=10;
11 return num;
12 }
13
14 void main()
15 {
16 int a = 3;
17 int b = a+1;// 右值转左值
18 std::cout << getdata(std::move(a)) << std::endl;
19 // std::move(a) 将左值转换为右值 C++11 语法
20 }
21
22 //----------------------------------------------------
23
24 /* 常引用 */
25
26 void main()
27 {
28 const int num(6);
29 char str[10]("hello");// 限定字符串不被修改
30 const char *pc(str);// 指向常量的指针限定了指向的数据无法修改 +1,+2,都不行
31 str[3] = 'x';// 可以
32 pc[3] = 'y';//不可以
33 pc = "word";// 可以
34 }
35
36
37 void main()
38 {
39 char str[10]("hello");
40 const (&rstr)[10](str);// 常量引用
41 const char(&rrstr)[10](rstr);// 引用可以给另一个引用初始化
42 str[4] = 'X';
43 rstr[4] = 'Y';// 不可以
44 }
45
46 //----------------------------------------------------
47
48 /* 引用函数指针限定不被修改 */
49
50 void main()
51 {
52 int (*p)(int a,int b)(jia);
53 std::cout << p(1,2) << std::endl;
54 int (* const &rp)(int a,int b)(p);// 引用一个函数指针
55 rp = jian;// 不可以,限定了函数指针不可以修改
56 }
长风破浪会有时,直挂云帆济沧海
posted on 2015-05-28 21:39 Dragon-wuxl 阅读(241) 评论(0) 收藏 举报
浙公网安备 33010602011771号