关于const的几种非常见应用

1、修饰指针变量的几种情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 0、正常指针,可以给p赋值,也可以给*p赋值
int *p = &a;
 
// 1、const修饰*p,可以给p赋值,不可能给*p赋值
int const *p = &a;
const int *p = &a; constint位置互换是等价的
p = &b;
*p = 20;// 编译报错
 
// 2、const修饰p,不可以给p赋值,可以给*p赋值
int * const p = &a;
p = &b;	// 编译报错
*p = 20;
 
// 3、const修饰*p, const修饰p,p与*p都不可以赋值
int const * const p = &a;
const int * const p = &a;//与上一行等价
p = &b;	// 报错
*p = 20;	// 报错

2、修饰不同类型的引用

1
2
3
4
5
6
7
8
9
long a = 10;
//  不同类型的引用,编译不通过
// int &r = a;
// 加const修饰,编译通过
int const &r = a;
// const修饰的引用,被当做常量保存
a = 20;
// 修改原值后,r的值不变,还是引用时的值,r输出为10
cout << r << endl;

3、修饰数组的引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义数组变量
int array[] = { 1, 2, 3, 4 };
 
// 不加括号则表示指针数组,而非指向数组的指针
int (*p_array)[4] = &array;
// 类似指针,不加括号则表示为引用数组,而非数组引用
int (&r_array)[4] = array;
// 引用与指针都要表明指向或引用的数组长度,不灵活
// 数组本身可以用指针来表示
int *p = array;
// 指针的引用则很好表示,这样一来rp则表示数组的引用
int *&rp = p;
// 跳过中间p的转换,直接引用会怎样?因为类型不匹配而报错
// 加const修饰引用,则是被允许的
int * const &rp1 = array;

Leave a Reply