const正确性

时间:2010-06-03 16:11:21

标签: c++ const

我正在经历:C++ FAQs about inheritance并决定实施它(只是为了学习它)

#include "Shape.h"

 void Shape::print() const
 {
     float a = this->area();  // area() is pure virtual
     ...
 } 

现在,一切(好吧,差不多)按照项目:faq:23.1中的描述工作,除了print()是const,所以它不能访问“this”指针,只要你取出const,它就可以了。 现在,C ++常见问题解答已经存在了一段时间,通常都很好。这是一个错误吗? 他们有错字还是错了?如果我错了,我想知道如何在const函数中访问“this”指针。

5 个答案:

答案 0 :(得分:18)

问题是area()函数不是const。如果该函数是const,那么这将编译正常。由于你的const函数内部,this指针是const,因此你只能在它上面调用const函数。

答案 1 :(得分:8)

为什么无法访问this?关键是,只能使用const个成员和方法。因此,如果Shape::area()被声明为const,则没有问题。此外,您可以自由读取数据成员值,但不能分配给它们:

class Shape 
{
  int i;
  void print() const;
  virtual float area() const = 0;
  virtual void modify() = 0;
};

void Shape::print() const
{
  float a = this->area(); // call to const member - fine
  int j = this->i;        // reading const member - fine

  this->modify();         // call to non const member - error
  this->i++;              // assigning to member - error
}

答案 2 :(得分:1)

如果print被定义为const,那么它可以使用this来访问const成员但不能访问非const成员:所以它可以如果this->area()方法被声明为area,则调用const if {和}}(即如果area方法承诺如果它被调用则赢了不要改变它的Shape实例。

答案 3 :(得分:1)

默认情况下,将所有函数声明为const也是一种很好的做法,只有在实际需要修改对象时才这样做。这也有助于发现一些函数修改了它不应该意味着的错误。

答案 4 :(得分:0)

您当然可以访问this指针,但在const函数中它会成为指向const对象的指针。请记住,this指针不是真正的指针实例,因此它可以在程序的不同位置更改其类型。