浅谈C++中const成员和非const成员的联系和区别
来源:互联网 发布:手机酷狗链接不到网络 编辑:程序博客网 时间:2024/05/23 00:18
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类型。
- 浅谈C++中const成员和非const成员的联系和区别
- 浅谈C++中类的const成员变量,static成员变量和const static成员变量的区别
- C++中const成员函数和非const成员函数的重载
- C++中const成员函数和非const成员函数的重载
- C++中 const对象和非const对象与const成员的关系
- 在const和非const成员函数中避免重复
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 【C++】const对象和const成员
- C++中类的const成员函数和const对象
- const成员函数和非const的成员函数之间的调用
- const成员函数和非const成员函数返回引用的问题
- const成员 和 static成员
- const成员对于const对象和非const对象的访问原则
- 如何通过ssh来连接虚拟机(vmware)中的ubuntu
- KMeans聚类算法
- android定义animation动画效果
- FFmepg 多线程解码历程 - 5: ff_thread_init
- git install on Red Hat 5
- 浅谈C++中const成员和非const成员的联系和区别
- HTTP Live Streaming with a Webcam on Linux using VLC and a Segmenter
- ubuntu 快速部署openvpn
- SSH 登录ubuntu server在命令行中按tab键时总是提示LC_CTYPE 相关信息的解决办法
- 不由XML Layout 文件而由程序动态生成AlertDialog 及在其中附加更多UI 控件
- R.java 文件不能生成原因探究
- Winpcap的安装使用方法
- timyxml的简单使用
- struts2标签详解