文章目录
类作用域、对象生命期、const限定
1. 类的作用域
3. 常对象、常数据成员、常成员函数
既要使数据能在函数间共享,又要保证它不被任意修改,可以使用const限定,把数据定义为只读的
常对象
-
定义形式
const Data d1; // 类名 const 对象名1(实参列表),对象名2, ... // 或 Data const d2(10, 20, 100); // const 类名 对象名1(实参列表)
-
常对象中的数据成员:常对象中的数据成员均是const的,因此必须赋初值,且不能被修改
-
常对象中的成员函数:除了合成的默认构造函数和默认析构函数,不能调用常对象中的非const类型的成员函数
-
如何修改常对象中某个数据成员的值:将数据成员声明为mutable
mutable int data; // mutable 数据成员类型 数据成员列表;
常数据成员
-
定义形式
const int data; // const 数据成员类型 数据成员名列表;
-
即使成员函数也不允许修改常数据成员的值
-
常数据成员只能通过构造函数初始化列表进行初始化
常成员函数
-
定义形式
class Data{ int getx() const { return x; } }; // 或者 class Data{ int getx() const; } int Data::getx() const { return x; }
注意:
-
const位于函数头和函数体之间,若写成如下形式则表示函数返回值为只读的
const 返回类型 函数名(类型 参数名);
-
无论声明还是定义常成员函数都要有const关键字
-
-
const限定访问关系
数据成员 非常成员函数 常成员函数 非常数据成员 允许访问,可以修改 允许访问,不能修改 常数据成员 允许访问,不能修改 允许访问,不能修改 常对象数据成员 不允许访问和修改 允许访问,不能修改 -
常成员函数不能调用另一个非常成员函数
4. 指向对象的常指针、指向常对象的指针、对象的常引用
指向对象的常指针
-
定义形式
Data d(10, 20, 100), d1; Data *const p = &d; // 对象的常指针必须在定义时初始化,因为其后不能再指向别的对象了 p= &d1; // 错误,这样的指针始终保持其初值,程序中不能修改其指向
说明:
- 虽然常指针的const不能改变指向,但常指针所指向的对象却不一定是const的
- 使用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值
指向常对象的指针变量
-
定义形式
const Data *p; // 指针变量指向的对象为const,不能通过它改变所指向的对象的值
-
指向对象的常指针和指向常对象的指针的区别
Data *const p = &d; const Data *p;
-
一个指向常对象的指针变量,即使他指向一个非const的对象,其指向的对象也不能通过指针来改变
对象的常引用
-
定义形式
const 类名 & 引用变量名