C++中的const

1. 整型常量

int const a;	// 整型常量
// 或const int a;

a被声明为为一个整数,它的值不能修改。

2. 常量指针(指向常量的指针变量)

int const *pci;		// 指向整型常量的指针

己值(他址)可以修改,他值不可修改。

3. 指针常量(指向变量的指针常量)

己值(他址)不可修改。

3.1 一般情形

int * const cpi;	// 指向整型的指针常量 

己值(他址)不可修改,他值可以修改1

3.2 引用的本质

int a;
int &ref = a;	// 编译器内部发现ref是引用,自动转换为int *const ref = &a
ref = 100;		// 编译器内部发现ref是引用,自动转换为*ref=100,进行解引用

把指针常量表达为数值字面值的形式几乎没有用处,C语言内部并没有特地的定义这个概念。

3.3 this指针的本质

this指针的本质,是指针常量。相当于:

className *const this;			// className为类名

3.4 整型字面值+强制类型转换

*(int *)100 = 25;	// 指向整型的指针常量

强制类型转换将值100从“整型”转换为“指向整型的指针”,然后进行间接访问。
这个技巧极少用到,唯一有用之处是偶尔需要通过地址访问内存中预先已知的某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身

3.5 数组名

数组名的值(己值、他址)是一个指向内存中数组的起始位置(数组中第一个元素)的指针常量。
只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。

注意两个特殊:sizeof(数组名)返回整个数组的长度;&数组名所产生的是一个指向数组的指针。
C语言中 数组名 与 ”&数组名” 的区别

4. 常量引用

4.1 只有别名,没有原名

引用必须是一块合法的内存空间

//----------------- 非法操作
// int & ref = 10;		// 会报错
//----------------- 
// 加上const之后,编译器创建一个临时的变量存储10,引用指向该临时变量
const int & ref = 10;	// 别名→临时变量→赋值,相当于变量只有别名而没有原名

4.2 修饰形参,防止误操作

// 打印数据
void showValue(const int &val){
	// val = 1000;			// val不能被修改,修改即报错
	cout << "val = " << val << endl;
}

5. 常函数与常对象

成员属性声明时,加关键字mutable,在常函数和常对象中都可以修改。

5.1 常函数

  • 成员函数后加const,则称这个函数为常函数。
  • 常函数内不可修改成员属性。
class Person{
public:
	// 在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
	void showPerson() const{	// this指针相当于const className * const this
		m_A = 100;		// 报错
		m_B = 1000;		// Ok
	}
	int m_A;
	mutable int m_B;	// 声明成员属性加mutable,即使在常函数中,也可以修改这个值
}

5.2 常对象

  • 声明对象前加const称该对象为常对象。
  • 常对象只能调用常函数。
const className objetName;

疑问:是否可以调用常量呢?


5.3 拓展

  • 静态成员变量
    静态成员变量不属于某个对象,所有对象共享同一份数据,通过对象、类名都可以访问静态成员。
    需要类内声明、类外初始化,在编译阶段分配内存,存储在全局区。
class className{
public:
	static int m_a;				// 类内声明
}
int className::m_a = 10;		// 类外初始化
void test01(){
	cout << className::m_a <<endl;	// 通过类名访问静态成员变量
	className objectName;
	cout << objectName.m_a <<endl;	// 通过对象访问静态成员变量
}
  • 静态成员函数
    静态成员函数不属于某个对象,所有对象共享同一个函数,通过对象、类名都可以访问静态成员。
    静态成员函数只能访问静态成员变量,是因为非静态成员函数属于对象不符合静态成员函数不属于某个对象相矛盾。

6. 其它

int const * const cpci;

己值(他址)、他值,均不可修改。

  • 一个翻译问题《Pointers on C》Page 53,Page 198

在这里插入图片描述
在这里插入图片描述
constant pointer / to something else ×
constant / pointer to something else √

7. 参考及推荐

关于C++ const 的全面总结
常量引用

[1] 《C和指针》Page34、Page38、Page98、Page141.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值