当前位置: 首页 > 知识库问答 >
问题:

“this”指针如何用作成员函数的参数

徐麒
2023-03-14

我有一堂简单的课

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”指针如何用作函数2的参数?

共有3个答案

别帅
2023-03-14

成员函数的实例参数是隐式的。也就是说,它从来不是函数声明的一部分,但它仍然存在。

请记住(非静态)成员函数不是函数。你不能只给他们打电话。相反,您必须始终在实例对象上调用它们。此实例对象隐式地是成员函数的参数,但从未被阐明。可通过此表达式在函数内部使用。

如果隐式实例参数绑定到常量对象,则this的类型是T const*,并且只能调用限定为const的成员函数。易失性类似,也有类似的规则将隐式实例参数绑定到右值引用。

凌俊语
2023-03-14

您看到的是C定义方式的产物。成员函数会自动向每个函数添加一个隐藏的参数。如果对象是常量,则指针也是常量,非常量成员函数必须接收非常量指针。

莫英喆
2023-03-14

ulufoo::func2()是非const,这意味着它可能会更改对象。因此编译器不允许您为const对象调用它。即使您实际上没有更改Func2的实现中的任何内容。this是任何非静态成员函数的隐式参数。这就是它如何知道它被调用的确切对象。

1在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是为其调用函数的对象的地址。

 类似资料:
  • FAQs in section [33]: [33.1] “成员函数指针”类型不同于“函数指针”吗? [33.2] 如何将一个成员函数指针传递到信号处理函数,X事件回调函数,系统调用来启动一个线程/任务等? [33.3] 为什么我总是收到编译错误(类型不匹配)当我尝试用一个成员函数作为中断服务例程? when I try to use a member function as an interru

  • 问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然

  • 是否可以将指针作为可变模板参数传递给成员。我似乎搞不懂语法。 对于函数调用,它的工作原理如下: 可以这样使用: 我希望以类似于类模板的方式传递params 应该这样使用: 我很难弄清楚什么东西应该是什么。 如果成员类型已知,并且只有一个参数,则可以这样做: 有没有一种方法来推广这个变量参数列表的成员指针,其中成员是不同的未知事先类型? 更新:用于固定已知类型的成员指针的变量参数包声明如下: 现在我

  • 我遇到了一个语法问题。看另一个StackOverflow答案并不能给出一个适用于我的问题的答案。至少不是我能理解的。 我的计划程序类: 这一切都编译得很好,但问题在于调用该函数中的成员函数指针: 编译这个会给我带来错误; 其他尝试: 有人能帮我解释一下我缺了什么知识吗?

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问

  • 问题内容: 我有一个关于在嵌套函数方案中如何处理“ this”指针的问题。 假设我将以下示例代码插入到网页中。当我调用嵌套函数“ doSomeEffects()”时出现错误。我检查了Firebug,它表明当我使用该嵌套函数时,“ this”指针实际上指向全局“ window”对象,这是我所没有想到的。我一定不能正确理解某些东西,因为我认为自从我在对象的函数中声明了嵌套函数以来,它就应该具有相对于该