我正在经历: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”指针。
答案 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
指针不是真正的指针实例,因此它可以在程序的不同位置更改其类型。