一、C++中的const
1、c和c++中const的比较
c中const修饰的是只读变量,核心仍然是变量
c++中const修饰的是常量,会将数据存放在符号表中,读取时从符号表中读取
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 const int a = 1; //C++中const修饰的常量,存放在符号表中,键值对
8 //a++;
9
10 int *p = (int *)&a; //对const修饰的常量取地址,编译器分配了一个整形的长度,并且把数字1填写到对应的内
存中
11 *p = 2;
12
13 cout << a << endl; //因为a是常量,所以用1替换a
14
15 return 0;
16 }
2、const和#define的比较
相同:修饰的都常量
不同:作用域不同,const修饰的是局部变量,define修饰全局变量,编译时const会做类型检查,define只是简单的替换。
二、C++的引用(引用就是变量的别名,必须初始化且无法修改)
1、普通引用
①引用的概念
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 int a = 100;
8
9 int &b = a; //定义引用b初始化为a b是a的别名
10 b = 200; //a = 200
11 cout << a << endl;
12
13 return 0;
14 }
②引用的意义
1、引用作为其它变量的别名而存在,因此在一些场合可以代替指针;
2、引用相对于指针来说具有更好的可读性和实用性。
20 swap(m,n);
5 void swap(int &x,int &y)
6 {
7 y = x + y;
8 x = y - x;
9 y = y - x;
10 }
③引用的本质
引用在定义时,必须初始化,且无法修改:不初始化,是个垃圾值,不能用
在奇怪语法中是指针
5 struct Test
6 {
7 int &a;
8 int &b;
9 };
10
16 int &pa = a; //引用在定义时,必须初始化
17 char &pc = ch; //类似于 char *const pc = &ch;
18
19 //int &ps;
20
21 cout << sizeof(pa) << endl; //引用的长度就是其引用的对象的长度
22 cout << sizeof(pc) << endl;
23
24 cout << sizeof(Test) << endl;
④返回值为引用
1.不要返回局部变量的引用:函数结束后自动清空
2.全局变量可以返回
1 #include <iostream>
2
3 using namespace std;
4
5 int g = 100;
6
7 int &f1()
8 {
9 int a = 1;
10 return g; //不要返回局部变量的引用
11 }
12
13 int f2()
14 {
15 return g;
16 }
17
18 int main()
19 {
20 int &b = f1();
21
22 f1() = 1;
23 //f2() = 1; //等价于100 = 1 错误
24
25 return 0;
26 }
⑤指针引用
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4
5 using namespace std;
6
7 void Init(char *&s) //引用指针 s是地址 用char *表示地址
8 {
9 s = (char *)malloc(sizeof(char) *100);
10 }
11
12 int main()
13 {
14 char *s = NULL;
15
16 Init(s);
17
18 strcpy(s,"hello");
19
20 cout << s << endl;
21
22 return 0;
23 }
2、常引用
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 int a = 1;
8 int &pa = a; //可以用变量初始化普通引用
9
10 //int &pb = 1; //不可以用常量初始化普通引用
11
12 const int &pc = a; //常引用 变量可以初始化常引用
13 //pc++ 不能通过内存来修改对应内存的值
14 a++; //通过其他方式修改
15 cout << pc << endl;
16
17 const int &pd = 1; //可以使用常量初始化常引用 pd不能修改,操作系统会分配四个字节,填上1,名字叫pd
18 int *p = (int *)&pd;
19 (*p)++;
20
21 cout << pd << endl;
22
23 return 0;
24 }