我有这个简单的课程
class foo {
public:
void func() const;
void func2();
};
void foo::func() const {}
void foo::func2() {}
int main() {
const foo f;
f.func();
f.func2();
}
当我尝试编译时,我收到此消息:
错误:将'const foo'作为'void foo :: func2()的'this'参数传递'丢弃限定符[-fpermissive]
我理解使用const对象的非const成员,我的问题是'this'指针如何用作func2的参数?
7 回答
void foo::func2()
是非常量,这意味着它可能会更改对象 . 因此,编译器实际上并没有改变func2
实现中的任何内容 .this
是任何非静态成员函数的隐式参数 . 这就是它如何知道它所要求的确切对象 .9.3.2这个指针[class.this]
您正在看到C定义方式的工件 . 成员函数自动为每个函数添加隐藏的
this
参数 . 如果对象是const
,则指针也是const
,非const成员函数必须接收非constthis
指针 .成员函数的实例参数是隐式的 . 也就是说,它永远不是函数声明的一部分,但它仍然存在 .
请记住(非静态)成员函数不是函数 . 你不能只是打电话给他们 . 相反,您必须始终在实例对象上调用它们 . 此实例对象隐式地是成员函数的参数,但从未拼写过 . 它通过
this
表达式在函数内部可用 .如果隐式实例参数绑定到常量对象,则
this
的类型为T const *
,并且只能调用限定为const
的成员函数 . 类似地,对于volatile
,并且还存在用于将隐式实例参数绑定到右值引用的类似规则 .你不能在const对象
f
上调用非const函数func2
.既然你的问题是:
这里引用了一些来自IBM C++ documentation: this pointer的信息:
.
在OOP(通常)中,编译器将所有实例方法静默转换为静态函数,并将指向构造实例状态(即
this
)的结构的指针添加为隐藏的第一个参数 .所以这:
实际上是这样实现的:
你的成员函数func2()应该是const . 见here .
在计算机上运行的实际代码中,
func2
的代码需要知道foo
的哪个实例要查看/执行操作 . 因此它将一个指针(this
)传递给实例 .