C++ const说明

C++ const说明

  • const 介绍
  • 直接上代码
  • "顶层const"和"底层const"
  • const引用
  • 总结

const 介绍

const 变量必须初始化,因为其存放在 .rodata 段。

直接上代码

#include 
using namespace std;

class A {
public:
	int m1 = 1, m2 = 2;
};


int main() {
	A a, b;
	const A ca;

	const A * p1 = &a; // 被指向的对象不能改变
	//p1->m1 = 10; // wrong,因为被指对象不能改变
	p1 = &b; // right,因为指针本身可以改变

	const A* p2; // 不初始化也可以,反正指针本身可以改变,指针不是常量,也就和普通指针没啥区别

	const A* p3 = &ca;

	//A* p4 = &ca; // wrong,不允许绑定常量到非const

	//const *A p5 = &a; // 语法错误

	const const const A* p6 = &a; // 连着写的const没什么特殊意义,等同于"const A* p6 = &a;"
	//p6-> = 10; // wrong
	p6 = &b; // right

	A* const p7 = &a; // 指针本身不可变,所指对象可变
	p7->m1 = 10; // right
	//p7 = &b; // wrong

	A* const const const p8 = &a; // 同样,连着写的const等同于一个
	p8->m1 = 20; // right
	//p8 = &b; // wrong

	const A* const p9 = &a; // 星号在第一个const右边,所指对象不可变;星号在第二个const左边,指针本身不可变
	//p9->m1 = 11; // wrong
	//p9 = &b; // wrong

	A const * p10 = &a; // 星号在const右边,还是所指对象不能改变
	//p10->m1 = 10; // wrong
	p10 = &b;

	const A const * p11 = &a; // 星号在const右边,还是所指对象不能改变;
							  // 类型A与const的位置没关系,所以前面等同于"const const A",也就是等同于"const const A* p11",和p1等同。
	//p11->m1 = 11; // wrong
	p11 = &b; // right

	//const * const A p12 = &a; // 语法错误,星号一定要在类型A的右边

	//const * A const p13 = &a; // 语法错误,星号一定要在类型A的右边

	A const const * p14 = &a; // 多个const连写等同于一个const

	// 星号在const中间(也就是既有在星号左边的const,也有在星号右边的const),所以指针和所指对象都不可变
	// 另外,const和类型A没有顺序之分,等同于"const A * const"
	A const * const p15 = &a; 
	//p15->m1 = 15; // wrong
	//p15 = &b; // wrong

	return 0;
}

“顶层const"和"底层const”

  • 顶层constA* const表示指针本身不可变。
  • 底层constconst A*表示所指对象不可变。

const引用

引用的性质之一就是本身不可改指其他对象,所以没啥好说的。
const引用都是所指对象不可改变,即都是底层const。

总结

  • const与类型声明没有顺序之分
  • 多个连写的const等于一个const
  • 星号在const左边,即A * const,则为顶层const,指针本身不可变
  • 星号在const右边,即const A *,则为底层const,所指对象不可变

你可能感兴趣的:(C++,c++,开发语言)