先来总结一下const的一些普遍用法:
1 可以用来定义常量,称为const常量
const int x = 100;
2 用来修饰引用,称为const引用,表明不能修改引用所引用的变量的值
const int &ref = x;
int &ref2 = x; //Error, ref2不是常量,可以修改引用所指向的变量x的值,而x实际上是常量,不允许修改,故不合逻辑,这种用法是错误的
3 用来修饰指针,有三种情况
第一种,const出现在*左边,表示(*指针)是常量,而指针是变量,可以指向其它变量,如下:
const int *p;
第二种,const 出现在*右边,表示指针是常量,指针不能指向其它变量,但是可以改变指针指向的变量的内容,如下:
int *const p = &x;
第三种,const既在*左边,也在*右边,表明指针是常量,指针所指向的变量的内容也是常量,如下:
const int *const p = &x;
4 用来修饰类中的数据成员,称之为const数据成员,const数据成员的初始化要在构造函数的初始化列表中进行。不能在数据成员定义时直接初始化。
5 用来修饰类对象,称为const对象
const Test t(10);
6 用来修饰类中的成员函数,称之为const成员函数,表示该函数不能修改对象的状态,也就是说它只能访问数据成员(Read Only),而不能修改数据成员。
上面已经将const的所有用法进行了总结回顾,这里再分析一下,当const用来修饰类中的成员函数时,它不能修改类中的数据成员,但是在某些场合,它还是需要修改类的的某些数据成员时,该怎么办呢?这时候mutable类型的作用就发挥出来了,mutable的英文名是可变的,易变的,即由它修饰后的数据成员,无论是在const成员函数,还是非const成员函数均可以访问它,当然,除了static静态成员函数外(因为静态成员函数没有this指针,不能访问对象数据成员及函数)。这样一来,const成员函数就不能修改类中的非mutable修饰的数据成员,对这些数据成员只能是read only,但是却可以read/write那些由mutable修饰的数据成员了。在某些应用场合是比较灵活的。下面就举个简单的例子说明这些问题:
#includeusing namespace std; class Test { public: Test(int x):x_(x), outputTimes_(0) { } //因为Getx()这个成员函数不会去更改x数据成员,所以用const修饰,称之为const成员函数,它不能去修改数据成员的值 int Getx() const { //x_ = 100 ;// Error, const成员函数不能修改数据成员的值 cout << "const Getx..."<< endl; return x_; } //非const成员函数与上面const成员函数构成重载 int Getx() //非const与const成员函数是可以构成重载的 { cout << "Getx..."<
- <script type="text/java script">BAIDU_CLB_fillSlot("771048");
- 点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)