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
如果这个问题之前有人回答过,我很抱歉,我找不到任何答案。
我在保持 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