今天我注意到'this'的类型有些奇怪。如果您有这样的事情:
class C {
void funcA() {
funcB(this);
}
void funcB(C obj) {
//do something
}
};
你当然会得到一个错误,因为funcB()需要一个对象,而'this'是一个指针。我不小心忘记了星号,但对错误信息感到惊讶,因为它说:
no matching function for call to 'C::funcB(C* const)'
当funcA()不是常数时,const来自何处?
答案 0 :(得分:9)
这就是说this
指针本身为const
- 即你不能修改指针以指向不同的内存。
回到C ++的非常早期历史记录中,在您重载new
和delete
之前,或者发布了新的展示位置,this
是非const指针(至少在ctor内部)。想要处理自己的内存管理的类是通过在构造函数中为实例分配空间,并在退出构造函数之前将该内存的地址写入this
来实现的。
在const成员函数中,您要处理的类型为Class const *const this
,这意味着this
指向的是const
(以及指针本身为{{1} }})。
答案 1 :(得分:8)
C* const
并不意味着类型C
的对象是常量。那将是C const*
或const C*
。
C* const
表示指针本身是常量。
这是有道理的,因为你无法做到
this = &something_else;
答案 2 :(得分:4)
请注意,它不是C const *
,而是C* const
。即(从右到左阅读)指向C
的常量指针。
答案 3 :(得分:4)
C const*
和C * const
之间存在差异。您需要了解其中的区别:
C const*
表示它是对象(由指针指向)是常量。C * const
表示指针本身是常量。因此this
定义为C * const
类型的指针,因此无法对其进行修改,但仍可修改其指向的对象。
答案 4 :(得分:3)
指针本身是常量,而不是指向的数据。