文章目录
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 √