需要澄清 const 成员函数

发布于 2024-11-03 12:12:06 字数 541 浏览 8 评论 0原文

我有点困惑为什么这段代码会编译和运行:

class A
{
private:
    int* b;
public:
    A() : b((int*)0xffffffff) {}
    int* get_b() const {return this->b;}
};

int main()
{
    A a;
    int *b = a.get_b();
    cout<<std::hex<<b<<endl;
    return 0;
}

运行这段代码的输出也是 FFFFFFFF 以及...出乎我的意料。 this->b 不应该返回 const int* 因为它位于 const 成员函数中吗?因此 return 行应该会生成一个编译器转换错误,用于尝试将 const int* 转换为 int*

显然,我的了解 const 成员函数的含义。 如果有人能帮助我弥合这一差距,我将不胜感激。

I'm a little confused as to why this code compiles and runs:

class A
{
private:
    int* b;
public:
    A() : b((int*)0xffffffff) {}
    int* get_b() const {return this->b;}
};

int main()
{
    A a;
    int *b = a.get_b();
    cout<<std::hex<<b<<endl;
    return 0;
}

Output of running this code is FFFFFFFFas well... unexpected by me. Shouldn't this->b return const int* since it is in a const member function? and therefore the return line should generate a compiler-cast error for trying to cast const int* to int*

Obviously there's a gap here in my knowledge of what const member functions signify.
I'd appreciate if someone could help me bridge that gap.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

想你的星星会说话 2024-11-10 12:12:06

不,该成员是一个 int* const (从 const 函数可以看出),这是完全不同的。

指针是const,而不是指向的对象。

No, the member is an int* const (as seen from the const function), which is totally different.

The pointer is const, not the object pointed to.

你好,陌生人 2024-11-10 12:12:06

成员函数的 const 部分只是表示当 this 指针(也称为调用它的对象)为 const 时,允许调用该函数。与返回值无关。

class A{
public:
  void non_const_func(){}
  void const_func() const {}
};

int main(){
  A a;
  a.const_func(); // works
  a.non_const_func(); // works too

  const A c_a;
  c_a.const_func(); // works again
  c_a.non_const_func(); // EEEK! Error, object is const but function isn't!

}

The const part of a member function just says that the function is allowed to be called when the this pointer (aka the object on which it is called) is const. It got nothing to do with the return value.

class A{
public:
  void non_const_func(){}
  void const_func() const {}
};

int main(){
  A a;
  a.const_func(); // works
  a.non_const_func(); // works too

  const A c_a;
  c_a.const_func(); // works again
  c_a.non_const_func(); // EEEK! Error, object is const but function isn't!

}

云淡风轻 2024-11-10 12:12:06

该函数按值返回一个整数指针 - 您无法通过该值更改它是其副本的类成员,因此不存在 const 违规。

The function returns an integer pointer by value - you can't change the class member it is a copy of via this value, so there is no const violation.

逆蝶 2024-11-10 12:12:06

像您一样将 const 放在函数声明之后告诉编译器“嘿,我保证不会修改 *this!”。您的方法只是一个访问器。

请参阅 C++ 常见问题解答 LITE 18.10

Putting const after the function declaration like you have tells the compiler "Hey, I promise not to modfy *this!". Your method is simply an accessor.

See C++ FAQ LITE 18.10

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文