C++中我们经常会碰到const数据成员和const成员函数,他们在使用方面跟非const数据成员和非const成员函数有很大的区别,这里根据自己的经验,谈一下自己看法,如有错误,请大家指教:
(1):在赋值方面,const数据成员只能采用初始化列表方式,而非数据成员可以采用初始化列表和构造函数体内赋值两种方式。
class Test
{
public:
Test(int x,int y):m_y(y)
{
m_x = x; //m_x也可以采用初始化列表方式,对于非内部数据类型最好采用初始化列表方式进行初始化
}
private:
int m_x;
const int m_y;
};
(2):在函数调用方面,const成员函数可以访问const数据成员(本身显示不能被修改)和const成员函数,可以访问非const数据成员,但是不能修改非const数据成员,且不能调用非const成员函数,而非const成员函数则没有限制。
class Test
{
public:
Test(int x,int y):m_y(y)
{
m_x = x; //m_x也可以采用初始化列表方式,对于非内部数据类型最好采用初始化列表方式进行初始化
}
void print_test1( ) const
{
printf("print_test1 m_y=%d\n",m_y); //可以访问,本身为const不能被修改
printf("print_test1 m_y=%d\n",m_x); //可以访问
++m_x; //不能被修改
show1(); //可以被调用
show2() ; //不能被调用
mut_z++;//mutable数据成员可以在const成员函数中被修改
}
void print_test2( )
{
printf("print_test1 m_x=%d\n",m_x);
printf("print_test1 m_y=%d\n",m_y);
++m_x; //可以被修改
show1(); //可以被调用
show2() ; //可以被调用
}
void show1() const { ...}
void show2() {...}
private:
int m_x;
const int m_y;
mutable int mut_z;
};
这里需要研究一下其真实原因,对于每个对象的成员函数(这里不包括static成员函数,因为其不属于某个对象),其都有一个隐形的参数,也就是指向该类对象的一个指针,普通的成员函数,this指针类型是A (A类)const * this,其可以改变this所指向的值,但是不能修改this所保存的地址。而对于const成员函数,this指针类型是const A * const *this,其既不能改变this所指向的值,也不能修改this所保存的地址,因此上述就很好理解了。
如果要在const成员函数中修改数据成员,怎么办呢,最简单的解决方式就是将数据成员声明为mutable类型。