C++ 常量赋值

C++ constness by assignment

如果这个问题之前有人回答过,我很抱歉,我找不到任何答案。

我在保持 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 是常量,因此无法调用 a.getC(),因为该方法不是常量。

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

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

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

此外,forwardInfo 应该是 const,因为我不想更改任何内容。

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

Ps。我可以使用 getter/setter 方法,但 class C 旨在用作传递到数据库的数据桶。

谢谢。

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

您可以像这样重载 "getC" 方法:

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

如果你调用的是const A&的函数,那么你也需要将该函数声明为const,因为编译器不知道A的对象是否会改变与否,因此它无法验证参数 const A& 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);
  }
};

注意 class A const C& getC() const { return c; }

中的行

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

您还需要将函数的 return 类型更改为 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