C++学习笔记之——回顾const对象、const成员函数、mutable类型

转载 2016年08月30日 16:20:10

原文地址:http://blog.csdn.net/ab198604/article/details/18980701
先来总结一下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修饰的数据成员了。在某些应用场合是比较灵活的。下面就举个简单的例子说明这些问题:

#include <iostream>  
using 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..."<<endl;  
        return x_;  
    }  

    int Setx()  
    {  
        return x_;  
    }  


    void Output() const   
    {  
        //x_ = 102; //Error,不能修改非mutable数据成员  
        cout << "x = "<< x_ << endl;  
        outputTimes_++; //可以修改mutable类型的数据成员  
    }  

    int GetOutputTimes() const  
    {  
        return outputTimes_;  
    }  

private:  
    int x_;  
    mutable int outputTimes_; //mutable数据成员  

};  

int main()  
{  
    //const对象,对象是常量,对象的状态不能更改,声明时要初始化  
    const Test t(10);  
    t.Getx(); //前提:若int Getx() const注释掉,则const对象是不能调用非const的Getx()成员函数的  

    //t.Setx(); //Error,理由同上,即const对象只能调用const成员函数,理由是:const对象是常量,对象的状态是不允许更改的,而非const即普通成员函数可以更改对象的状态,这所以为了实现不允许修改对象的状态这一目的,const对象禁止调用非const成员函数,而只能调用const成员函数,因为const成员函数也是禁止修改数据成员的,符合这一目的。  

    Test t2(20);  
    t2.Getx(); //调用的是非const的Getx,因为t2是普通对象,不是const对象  
    t2.Output(); //普通对象可以调用const成员函数,如果有重载的非const成员函数,则调用的是非const的成员函数  
    t2.Output(); //每输出一次,outputTimes_加1,因为它是mutable类型的数据成员,允许在const成员函数中被修改  

    cout << "outputTimes= "<< t2.GetOutputTimes() << endl;   

    return 0;  
}  

这里需要注意的是const对象由于不能修改对象的状态,const对象只能调用const成员函数,而普通对象可以调用任何的成员函数。此外const对象在声明时要进行初始化。这与const修改的变量是一致的,如const int x = 100; 当类中定义了2个同名称的函数,其中一个用const修饰,另一个没有const修饰,他们之间是构成重载的,这时const对象调用的是const成员函数,而普通对象调用的是非const成员函数。

相关文章推荐

const类型参数的对象引用和const成员函数

const类型参数的对象引用 在如下的类声明中: class C{ private: string name; public: C(){/*...*/} //default co...

C++回顾之const对象、const成员函数、mutable类型

总结const的各种用法,主要讲述const对象,及const 成员函数,还有mutable修饰的数据成员

const成员函数 --Effective C++学习笔记

概要: const成员函数基本,意味着什么? 如果const成员函数内部需要修改成员变量? 当两个函数功能相同,只是用作const与non-const对象,代码重复量很大时怎么办? c...

C++学习笔记(5)----类的const和非const成员函数的重载

类的const和非const成员函数的重载 我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char)。 只要了解过C++...

【C++学习笔记】使用控制符及流对象的成员函数控制输出格式

#include #include //不要忘记包含此头文件 using namespace std; int main() { int a; cout<>a; cout<<"de...

十四、对象的使用(二)const成员函数、const对象、mutable

一、const成员函数 const成员函数只能访问数据成员的值,不能修改对象的状态 class Test { private: int getA() const { a = 100;//错...

C++学习笔记16——成员函数

1,简介 类的成员函数主要分为两种: a.普通的成员函数 b.构造函数 成员函数的函数原型必须在类中定义,但是函数体既可以在类中定义,也可以在类外定义。 在类中定义的成员函数被编译器当作内联...

C++学习笔记之——显示类型转换(static_cast,const_cast,interpret_cast,dynamic_cast)

在我们进行c++编程时候,有时候我们希望显示地将对象强制转换成另外一种类型。   c++为我们提供了4中强制类型转换:static_cast、dynamic_cast、const_cast和reint...

2013级C++第6周(春)项目——对象指针、const【项目1-体验常成员函数】

/* * 程序的版权和版本声明部分 * Copyright (c)2013, 在校学生 * All rightsreserved. * 文件名称: 项目1.cpp * 作 者:刘旺 * 完成日期...

c++学习之const成员变量与成员函数

c++学习之const成员变量与成员函数 常类型是指用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的。因此,定义或说明常类型时必须初始化。 如果在一个类声明...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)