1.const在c语言和c++中的区别?
例子:
c编译器:
const int a = 1;
int* p = &a;
*p = 2;
printf("a = %d\n", a); // a = 2
c++编译器:
const int a = 1;
int* p = &a;
*p = 2;
printf("a = %d\n", a); // 编译失败
小结:在c语言中,const是只读变量,会被分配内存空间,可以通过指针改变其值;在c++中,const是真正的常量,会进入符号表,不会被分配内存空间。
2.什么是引用?
1)引用的符号:&
2)引用的作用:起别名
例子:
int a = 1;
int& b = a;
b = 2;
printf("a = %d\n", a); // a = 2;
小结:b是a的别名,操作变量b就是操作变量a。
3.什么是const引用?
1)const引用的作用:让变量成为只读变量。
例子:
int a = 4;
const int & b = a; // 让b变为只读变量
int *p = (int*)&b; // 通过指针来改变b的值
*p = 5;
printf("a = %d,b = %d\n",a,b); // a = 5,b = 5
4.用常量初始化常引用会分配地址。
例子:
const int& a = 1; // 会给a分配内存
int *p = (int*)&a; // 通过指针来改变a的值
*p = 2;
printf("a = %d,b = %d\n",a,b); // a = 5,b = 5
5.被volatile修饰的const常量,是只读变量,不会进入符号表,每次访问都从内存中取值。
例子:
volatile const int m = 10; // m是只读变量,没有进入符号表。
int* p = NULL;
p = const_cast<int*>(&m); // 指针p指向m的地址空间
*p = 20;
printf("m = %d, *p = %d, &m = %p, p = %p\n",m, *p, &m, p);
// 结果: m = 20, *p = 20, &m = 0x7fff470581c8, p = 0x7fff470581c8
6.使用其它变量进行初始化的const常量仍然是只读变量。
例子:
int m = 1;
const int z = m; // z是只读变量,没有进入符号表。m不是字面量
int& w = const_cast<int&>(z);
w = 30;
printf("z = %d, w = %d, &z = %p, &w = %p\n", z, w, &z, &w);
// 结果:z = 30, w = 30, &z = 0x7fffcc4e5a70, &w = 0x7fffcc4e5a70
7.const引用的类型与初始化变量的类型不同时,生成一个新的只读变量,其初始值与初始化变量相同。
例子:
char c = 'c';
char& rc = c;
const int& trc = c; // const引用的类型与初始化变量的类型不同
rc = 't';
printf("c = %c, rc = %c, trc = %c\n", c, rc, trc); // c = t, rc = t, trc = c
// 结果:c = t, rc = t, trc = c
总结:
1.只有用字面量初始化的const常量才会进入符号表;
(1)对const常量进行引用会导致编译器为其分配空间,但是这个空间中的值不会被使用。
(2)1, 2,3.0,‘a’,‘5’等常数和字符都是字面量。
2.使用其它变量进行初始化的const常量仍然是只读变量;
3.被volatile修饰的const常量,是只读变量,不会进入符号表,每次访问都从内存中取值
4.const引用的类型与初始化变量的类型
(1)相同:使初始化变量成为只读变量
(2) 不同:生成一个新的只读变量,其初始值与初始化变量相同