C++中共享数据的保护
在C++ 的编程过程中 ,如果既想要数据能自一定范围内被共享 ,又要保证它不被任意修改,可以使用const 也就是把某些有关的数据定义为常量。
常对象
定义对象的时候声明为常对象。必须要赋初值。
在所有的场合中,常对象中的成员的值都是不可以修改的。
例如 const Time t1(10,20,30);
如果对象被声明了常对象,那么任何企图调应常对象中的函数成员的形式都是违法的,编译器都会报错。因而,要把要把需要调用的函数成员也定义为const
如 void GetTime() const ;
这个定义就可以访问常对象的函数成员了。
例外:当要对常对象中的某个数据进行更改时候,(例如常对象中的计数变量 count )这时候要靠虑到编程的特殊性,所以引入了mutable ,
当常对象的某数据成员声明为 mutable int count 的时候,说明这个变量是可以改变的。
常对象成员
常数据成员
用法类似于一般的常变量,用关键字const来声明,常对象成员的值是不能改变的。只是通过构造函数的参数初始化表对常数据成员进行初始化。定义的具体格式是:Time::Time(int h) :hour(h){}只能通过这样的初始化列表来进行初始化。
常成员函数
一般的成员函数只能引用到本类中的非const 成员。也可以修改它们。
但是如果声明为了常成员函数,那么只能够引用到它们 ,但是却不能 修改它们。
const 成员函数可以引用包括:const 数据成员 ,非const数据成员和const的对象的数据成员,但是只是引用均不能改变它们的值。
非const成员函数对 非const数据成员 既可以引用也可以改变值
const数据成员 可引用但是不能改变值
const对象的数据成员 不可引用
常成员函数的应用:
如果在一个类中 ,有些数据成员的值允许改变,另外一些数据成员的值是不允许改变的,那么可以将一部分的数据成员声明为const 另一部分声明为非const ,
如果类中的所有的数据成员的值都是不允许改变的。那么可以把数据成员声明为const。
对于一个常对象 ,常成员函数 只能调用其中的const成员函数,而不能调用非const成员函数。
常函数成员不能调用任何一个非const函数成员
CSDN实例
- class Coo
- {
- public:
- Coo() : a(0)
- {}
- int getA() const //常量成员函数
- {
- ++a; //编译错误
- return this->a;
- }
- private:
- int a;
- };
这段代码当然编译不过去。但下面这一段呢?
- class Coo2
- {
- public:
- Coo2() : p(new int(0)) {}
- ~Coo2() {delete p;}
- int const * getP() const //常量成员函数
- {
- *p = 1; //编译OK
-
- return this->p;
- }
- private:
- int* p;
- };
- 答案是编译得过去,原因是代码也正确。在语义上,Coo2对象,拥有的是指针,而不是指针所指向的东西