'this'类型为"Class*const",即使方法不是const

x s*_*red 4 c++ const

今天我注意到'this'的类型有些奇怪.如果您有这样的事情:

class C {
    void funcA() {
        funcB(this);
    }

    void funcB(C obj) {
        //do something
    }
};
Run Code Online (Sandbox Code Playgroud)

你当然会得到一个错误,因为funcB()需要一个对象,而'this'是一个指针.我不小心忘记了星号,但对错误信息感到惊讶,因为它说:

no matching function for call to 'C::funcB(C* const)'
Run Code Online (Sandbox Code Playgroud)

当funcA()不是常数时,const来自何处?

Jer*_*fin 9

那就是说this指针本身就是const- 也就是说,你不能修改指针指向不同的内存.

早在非常 C++的早期历史,之前,你可以过载newdelete,或放置新的发明,this是一个非const指针(至少在构造函数中).想要处理自己的内存管理的类通过在构造函数中为实例分配空间,并this在退出构造函数之前写入该内存的地址来实现.

在const成员函数中,您要处理的类型将是Class const *const this,指的是this指向的是什么const(以及指针本身const).

  • 从技术上讲,这是不正确的.`this`不是常量指针,它是一个*表达式*(*prvalue*),它产生一个指向调用成员方法的对象的指针.但是,是的,实现可能是创建一个常量指针,并将其命名为`this` ...(尽管标准表示表达式`this`的类型是非const指针,指向可能的const-volatile限定对象) (2认同)

asc*_*ler 8

C* const并不意味着类型的对象C是不变的.那将是C const*const C*.

C* const 表示指针本身是常量.

这是有道理的,因为你做不到

this = &something_else;
Run Code Online (Sandbox Code Playgroud)