显然const
是可以修饰const成员变量、const成员函数和const对象的,当const
关键字用于这三者,有如下特性:
-
const成员变量
为只读变量,只能通过初始化列表初始化 -
const成员函数
不能直接改写成员变量的值,并且只能调用const成员函数
-
const对象
为只读对象,只能调用const成员函数
,非const对象
也可以调用const成员函数
#include "iostream"
using namespace std;
class Cplus
{
private:
const int m_number;
public:
int m_value;
Cplus():m_number(0)//const成员变量只能通过初始化列表初始化
{
m_value = 0;
}
~Cplus() {}
void set(int i)
{
int *p = const_cast<int*>(&m_number);//去除只读属性,const成员变量实际是只读变量,可修改
*p = i; //间接修改m_number的值
}
void print()
{
cout << "m_number = " << m_number << endl;
}
int get_number() const
{
//value = 3; //const成员函数不能直接修改成员变量的值,此处报错
//print(); //const成员函数只能调用const成员函数,此处报错
cout << "m_value = " << m_value << endl;
return m_number;
}
};
int main()
{
Cplus c1;
c1.print();
c1.set(5);//可修改说明const成员变量是只读变量
c1.print();
cout << c1.get_number() << endl; //调用const成员函数
cout << "-----------------" << endl;
const Cplus c2;
//c2.print(); 只读对象只能调用const成员函数,此处报错
cout << c2.get_number() << endl; //调用const成员函数
*const_cast<int*>(&c2.m_value) = 3;//c2可被修改说明const修饰的对象是只读对象
c2.get_number();
return 0;
}
运行结果
m_number = 0
m_number = 5 //m_number是const成员变量,这里被改变了,说明const成员变量是只读变量不是常量
m_value = 0 //说明普通对象也可以调用cosnt成员函数
5
-----------------
m_value = 0 //const对象调用const成员函数
0 //const对象可被间接修改,是只读对象
m_value = 3
参考
狄泰软件学院 - C++深度解析教程 - 第20课、24课