gpt4 book ai didi

c++ - 函数的返回数据类型的 const 含义

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:21 24 4
gpt4 key购买 nike

第二个声明 foo:B() 的真正 const 是什么意思?

int foo::A() const {
return m_var;
}


int const foo::B() {
return m_var;
}

对于第一个声明,我确信它“保护”了成员变量,即 m_var。

但是第二个声明的全部含义是什么,它只是向调用者返回一个常量 int 可能是非常量变量?我的意思是出于任何原因这有意义吗?

最佳答案

情况1:函数签名后的const表示函数不会改变对象。因此,您可以在 const 对象上使用它(或使用指向 constconst 引用的指针)。

情况2:函数名前的const确实是关于返回类型的。你是完全正确的:实际上它不会改变对象的任何东西,因为返回是在这个片段中按值完成的,并且这个值在一个不能改变的临时值中(例如 ++-- 无论如何都无效,因为没有左值)。

情况 3:返回类型中的 const 对于指向 const 的指针或 const 引用的返回更有意义。在这种情况下,它将防止从外部更改对象状态。

总结如下:

class foo {
public:
int A() const { // const function
return m_var;
}
int const B() { // non const function, but const return type
return m_var;
}
int const& C() const { // non const function, but const reference return type
return m_var;
}
private:
int m_var;
};

int main() {
const foo x{};
x.A(); // ok
//x.B(); // not ok -> function B() doesn't guarantee to leave x unchanged.
x.C(); // ok
const int& y = x.C(); // ok (y will not alter m_var.
//int& z = x.C(); // not ok since z is not const
return 0;
}

online demo

案例 4:(感谢 HolyBlackCat 指出)。在情况 2 中对标量没有影响的东西对类来说完全有意义。假设 m_var 属于 bar 类:

class bar {
public:
void change_it() {}
void read_it() const {}
};

那么 const 的返回值就会有所不同:

foo u{}; 
u.B(); // ok
u.B().read_it(); // ok
u.B().change_it(); // not ok because of constness of B().

online demo

关于c++ - 函数的返回数据类型的 const 含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53359378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com