【问题标题】:C++ constness by assignment通过赋值的 C++ 常量
【发布时间】:2015-07-06 06:05:13
【问题描述】:

如果这个问题之前已经回答过,我很抱歉,我在任何地方都找不到答案。

我在保持 const 正确性方面遇到了麻烦。

我有以下定义。

struct C {
   int x,y;
};

class A {
public:
  C c;      
  C& getC() { return c; }
};

class B {
public:
  void forwardInfo(const A& a) const {
    const C& c = a.getC();  // <= compiler complains here
    daoObject.updateTableX(c.x,c.y);
  }
};

编译器抱怨对象 a 是 const,因此不能调用 a.getC(),因为该方法不是 const。

但是,我将结果分配给 const 引用。 现在我只是将对象转换为非 const 引用,如下所示:

const C& c = ((A&)a).getC();

这可行,但并不优雅。有没有更好的方法而不改变常量。我相信对于对象 A,将 C 作为非 const 返回是合理的,因为它是要被更改的。

forwardInfo 也应该是 const,因为我不想改变任何东西。

我不确定为什么编译器不让我这样做,有没有更好的方法?

附言。我可以使用 getter/setter 方法,但 C 类旨在用作传递给数据库的数据桶。

谢谢。

修正:演员阵容中的括号位置和不正确的演员。

【问题讨论】:

  • 按照您的建议将结果投射到const 是行不通的。导致错误的是对象a,您在其上调用了非const 成员。

标签: c++ reference constants const-correctness


【解决方案1】:

你可以像这样重载“getC”方法:

C& getC() { return c; }
const C& getC() const { return c; }

【讨论】:

  • 我认为不需要重载,函数的第二种形式就足够了
  • 过载有效。为什么我没有想到……我确实需要这两种形式,因为有时我确实想更改 C 的内容。谢谢。
【解决方案2】:

如果您正在调用const A&amp; 的函数,那么您还需要将该函数声明为const,因为编译器不知道A 的对象是否会改变,因此它无法验证参数const A&amp; a的常量性

struct C {
   int x,y;
};

class A {
public:
  C c;      
  const C& getC() const { return c; }
};

class B {
public:
  void forwardInfo(const A& a) const {
    const C& c = a.getC();
    daoObject.updateTableX(c.x,c.y);
  }
};

注意A类const C&amp; getC() const { return c; }中的那一行

通过使用const,我们告诉编译器A::getC() 不会修改它被调用的对象,因此这将起作用。

您还需要将函数的返回类型更改为const,这是您需要的。

注意:您可以将非const 值分配给const 变量,但不能反过来。 const 是一个附加属性,它告诉编译器该值(或引用地址,在某种程度上也是一个值)不会改变。

      int foo1 = 5;
const int foo2 = 10;

      int& bar1 = foo1; // allowed
const int& bar2 = foo1; // allowed
      int& bar3 = foo2; // NOT allowed -> will give compile time error
const int& bar4 = foo2; // allowed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2021-04-06
    • 2020-06-26
    • 1970-01-01
    • 2018-03-28
    • 2011-10-06
    相关资源
    最近更新 更多