什么是const成员函数?

来源:互联网 发布:右肩膀酸痛 知乎 编辑:程序博客网 时间:2024/06/05 20:38

  有时候我们在类的成员函数后面加上一个const来修饰一个成员函数,表明这个成员函数不会修改成员变量的值,但是为什么这是为什么呢?我以下面这个例子来说明:

class base{public:    ...    void print()const{        cout<<n;    }    ...private:    int n;}

  我们知道将成员函数修饰为const的,那么这个函数就不能修改成员变量,也不能调用非const的成员函数。至于,为什么会有这样的功能,下面一一道来:

  我们知道成员函数都有一个隐藏的参数那就是this指针,这个指针指向该类的本身。我们应该知道的是一个类对象的是由哪些部分构成的。对于一个类其独有的东西就是他里面的非静态成员、虚函数表。而成员函数是所有类对象共享的。那么这些由一个类的所有对象共享的函数是如何区分各个类对象呢。答案就是通过this指针。

base B;B.print();

  这里声明了一个类对象,然后用类对象调用了print方法。它的实质不妨这样理解:

base B;print(&B);   //这里只是为了说明

  成员函数接受一个类对象的指针。到了函数内部就成了这样:

print(base * const this){    cout<<this->n;}

  散部在类对象外部的成员函数,通过一个类对象的指针来对类对象进行操作。这其实和C语言里面针对一个结构体写很多对于结构体进行操作的函数一样。当我们需要操作结构体的时候,我们就要传递一个结构体的指针给这个函数。这下应该明白,这个this的意义了吧。当然这里的this是const的我们不能在成员函数类修改this的指向。

  那么现在话题回到成员函数后面的const上面。它依然和this有关系。在上面讲this指针的时候,我们知道有下面这样的转化:

B.print();    |    Vprint(&B);    |    Vprint(base * const this){    //...do something}

  
  所以在函数里面我们可以做:

print(base * const this){    this->n=100;    cout<<this->n;}

  在成员函数里面我们可以修改成员变量,但是这里我们明显是不希望修改的。所以我们可以做下面这样的修改:

print(const base* const this){    this->n=100;  //错误,*thisconst的。}

  将指针指向的对象声明为常量,这就保证了成员函数内部的操作不能修改成员变量了。但是我们知道this是隐式的,我们要在哪里使用const来修饰this指针指向的对象呢。C++的设计者们说,把他放在函数的后面吧。所以就有了文章开头的那种写法。

  下面考虑这样一种情况,我们申明了一个常量对象

const base B;B.print();    |    vprint(&B);

  在print函数里面,有与B是const的,所以*this是const的,而在非const的成员函数中,隐式的申明是base * const this 所以常量对象调用调用非const的成员函数,那么就要将const base* const this转化为base* const this 这显然是不允许的,所以cosnt对象不能调用非const的成员函数。

  这下应该明白为什么是this指针,以及什么是const成员函数了吧?

0 0
原创粉丝点击