引用高级

  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)    收藏  举报

导航