1 //引用的作用:代码简洁
2 //形参和实参同地址,实现的方式和指针的一样
3 //引用和指针没有本质的区别
4
5 //强转引用
6 float f = 3.14f;
7 cout<< hex << (int&)f << endl;
8 cout<< hex << *(int*)&f <<endl;//两式是等价的
9
10 cout<< hex << (float&)(int&)f << endl;
11 cout<< hex << *(float*)&(*(int*)&f) << endl;//两式是等价的
12
13 //引用类型和指针类型的区别
14 char ch = 'a', ch2 = 'b';
15
16 //1.引用不能为 NULL ,必须初始化,指针可以为 NULL
17 // char& Ref = NULL; 错误:引用不能为 NULL
18 // char& Ref = 123; 错误:引用不能为常量
19 // char& Ref ; 错误:引用必须初始化
20 char& Ref = ch; //引用的初始化
21 Ref = 2;
22
23 //2.引用一旦绑定无法解除, 指针可以
24 Ref = ch2; //这里 Ref 的地址和 ch 的地址是一样,而不是 ch2 的地址
25
26 //3.没有二级引用,有二级指针
27
28 //引用当作函数的返回值
29 //1.当返回值为引用时,不能返回局部变量或形参变量
30 //使用场合:返回返回值当左值
31
32 int& fun()
33 {
34 //全局变量
35 return g_nNum;
36 }
37
38 int& fun1(int *pNum)
39 {
40 //实际上返回值的是实参
41 return *pNum;
42 }
43
44 int nN = fun1();
45 int& r = fun1();
46
47 //返回值当左值
48 fun1() = 2;
49
50
51 //const的用法
52 //1.不能当左值,通常用来替代无参数宏
53 不能把 const 转化为 非const
54 float const PI = 3.14f;
55 const float PI = 3.14f;
56
57 //2.const 是编译器做限制
58 float Area (float R)
59 {
60 float* pf = NULL;
61 const float PI = 3.14f;//此时的 PI 是在栈中不是在堆中
62 pf = (float*)&PI;
63 *pf = 2; //此时 PI 的值改变为 2
64 cout<< PI << endl;
65 }
66
67 char szBuff[10] = "Hello";
68
69 //指针的值可以修改,指向的内容不能被修改
70 const char *psz1 = szBuff;
71 psz1 = NULL;
72 //psz1[0] = 'a'; //错误
73
74 //指针的值可以修改,指向的内容不能被修改
75 char const *psz2 = szBuff;
76 psz2 = NULL;
77 //psz2[0] = 'b'; //错误
78
79 //指针的值不能修改,指向的内容可以修改
80 char * const psz3 = szBuff;
81 //psz3 = NULL;
82 psz3[0] = 'c';
83
84 //指针的值不能修改,指向的内容不能修改
85 char const * const psz4 = szBuff;
86 //psz4 = NULL;
87 //psz4[0] = 'd';
88
89 //指针的值不能修改,指向的内容不能修改
90 const char * const psz5 = szBuff;
91 //psz5 = NULL;
92 //psz5[0] = 'd';
93
94 总结:
95 1.当 const 在 * 的左边时,指针所指向的内容不能修改
96 2.当 const 在 * 的右边时,指针的值不能修改
97 3.当 * 的两边都有 const 时,指针的值和指针所指向的内容都不能修改
98
99 void fun( const int& nN1, const int& nN2)
100 {
101 //nN1、nN2 的值都不能被改变
102 cout<<nN1<<' '<<nN2;
103 }
104
105 调用函数--fun(2, 4); ------->输出:2 4
106 const引用,首先为 2和4 申请堆空间,然后地址
107 即 const--引用支持 常量 传给引用
108
109
110 //内联 inline
111 //注意:加了inline 编译器认为函数简单就内联,否者不内联(没有if for while。。。)
112 //1.通常用来替代有参宏
113 //2.比有参宏多了类型检查
114 //3.debug版不内联
115 //4.可以在头文件声明定义放一起,多文件包含没问题
116 //在类机构中,在类体内定义的成员函数都是内联函数
117
118 #define ADD(x,y) ((x) + (y))
119
120 inline int Add(int nNum1, int nNum2)
121 {
122 return nNum1 + nNum2;
123 }
124
125 int main(int argc, char* argv[])
126 {
127 cout << Add(1, 2) << endl;
128 cout << Add(2, 2) << endl;
129 cout << Add(3, 2) << endl;
130
131 cout << ADD(1.2, 2) << endl;
132 return 0;
133 }
134
135
136
137