【问题标题】:Function's const meaning for the return data type返回数据类型的函数 const 含义
【发布时间】:2018-11-18 09:16:51
【问题描述】:

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

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


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

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

但是第二个声明的全部含义是什么,它只是返回一个常量 int 给调用者,可能是非常量变量?我的意思是这是否有意义?

【问题讨论】:

  • 返回 const 值根本没有意义。
  • 不仅如此,组成foo f;的表达式f.B()的类型是int。所以我会说这对基本面值类型具有负面意义。对于某些用户定义的类型,在 C++11 之前,这样做是有边际意义的。现在没有了。
  • 有或没有constf.B() = 5; 是一个错误,所以它没有意义
  • 那是错误的骗局。 OP有两个例子。第一个是 const 方法,问题是关于第二个。投票重新开放
  • @user463035818 我严重不同意。这两个骗子完美地解释了const 关键字对两个代码示例的作用。

标签: c++ function constants class-design


【解决方案1】:

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

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

案例 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

【讨论】:

  • 如果我没记错的话,const 在返回算术类型时确实没有效果。但是对于类来说这是不同的(例如,不能有意义地移动 const 类实例)。虽然我不记得细节了。
  • @HolyBlackCat 感谢您指出!确实,这对一个班级来说是有意义的。我已经编辑了我的答案,并将这个额外的案例归功于你:-)
  • 也许值得一提的是 const 类的返回值会阻止 move 来自它们,因此不鼓励使用它们。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2021-12-13
相关资源
最近更新 更多