C++ const实例方法的最佳实践是什么?

C++ const实例方法的最佳实践是什么?,c++,constants,C++,Constants,鉴于公认的答案指出从const实例方法返回对成员的非const引用不会编译(没有强制转换或使成员变量可变),这个问题已成为对const实例方法的一般最佳实践讨论 对于子孙后代,这里有一个原始问题: 如果我有一个具有返回非常量引用的getter的对象,例如: SomeObject& SomeOtherObject::foo(){ return someObjectInstance; } 这应该是常数吗?显然,调用本身并不修改对象,但是调用方可以修改someObjectInstanc

鉴于公认的答案指出从const实例方法返回对成员的非const引用不会编译(没有强制转换或使成员变量可变),这个问题已成为对const实例方法的一般最佳实践讨论

对于子孙后代,这里有一个原始问题:

如果我有一个具有返回非常量引用的getter的对象,例如:

SomeObject& SomeOtherObject::foo(){
   return someObjectInstance;
}
这应该是常数吗?显然,调用本身并不修改对象,但是调用方可以修改someObjectInstance,这将改变我的SomeOtherObject实例

我想我的问题真的可以归结为“成员方法上的const到底意味着什么?”是a)调用本身不会变异对象还是B)调用期间不会发生对象变异,或者是由于返回的引用/指针(对执行const\u转换的人有一个警告)

作为旁白,我目前正在添加这个,我需要const调用

 const SomeObject& SomeOtherObject::constFoo() const{
   return someObjectInstance;
}
为了安全起见,因为我不愿意这么做

 SomeObject& SomeOtherObject::foo() const{
   return someObjectInstance;
}

即使这会让我在某些地方的生活更轻松。

回答你的问题:

“康斯特到底对一个会员有什么影响 方法是什么?”

这意味着该方法可以安全、合理地应用于常量对象。属于 当然,“安全”和“合理”的含义将取决于类模型的问题域


您可能还想考虑访问器返回值,而不是引用。如果他们必须返回参考资料,那么我将重新考虑我的总体设计。

回答您的问题:

“康斯特到底对一个会员有什么影响 方法是什么?”

这意味着该方法可以安全、合理地应用于常量对象。属于 当然,“安全”和“合理”的含义将取决于类模型的问题域

您可能还想考虑访问器返回值,而不是引用。如果他们必须返回参考资料,那么我会重新考虑我的总体设计

“康斯特到底对一个会员有什么影响 方法是什么?”

这意味着该方法不会改变特定类的成员变量。另外,使用const不允许该方法调用另一个非const方法

它用于可读性和清晰性,以及它的安全性,用于意外更改,可以是直接更改,也可以是调用另一种可能的方法

“康斯特到底对一个会员有什么影响 方法是什么?”

这意味着该方法不会改变特定类的成员变量。另外,使用const不允许该方法调用另一个非const方法


它用于可读性和清晰性,以及它的安全性,用于意外更改,可以是直接更改,也可以是调用另一种可能的方法。const的语义取决于问题域。如果有可能模棱两可,请将其记录下来


例如,如果您有一个类正在包装对数据库的访问,那么让“const”方法是那些不会更改数据库状态的方法是非常明智的,即使它们可能会更改对象的某些隐藏内部状态(使用“mutable”关键字允许这样做).const的语义取决于问题域。如果有可能模棱两可,请将其记录下来

例如,如果您有一个类正在包装对数据库的访问,那么让“const”方法是那些不会更改数据库状态的方法是非常明智的,即使它们可能会更改对象的某些隐藏内部状态(使用“mutable”关键字来允许此操作)。

const(应用于成员函数时)主要用作自我记录的一种手段。与调用代码的约定是,此函数不会修改外部状态(即没有可观察到的副作用)

编译器通过使所有成员在const成员函数中有效地保持常量来实现这一点

常见的代码如下:

const SomeObject& SomeOtherObject::constFoo() const;
SomeObject& SomeOtherObject::constFoo();
以下内容不会编译(MSVC 9和gcc 3.4.4)

您可以通过丢弃常量来绕过上述错误:

SomeObject& SomeOtherObject::constFoo() const{
  return (SomeObject&)someObjectInstance;
}
但这当然打破了与代码用户的约定,即您不会更改SomeOtherObject实例

您还可以使某些ObjectInstance可变,以避免强制转换,但最终它并不是更好。

常量(应用于成员函数时)主要用作自我文档化的一种方式。它与调用代码约定,此函数不会修改外部状态(即没有明显的副作用)

编译器通过使所有成员在const成员函数中有效地保持常量来实现这一点

常见的代码如下:

const SomeObject& SomeOtherObject::constFoo() const;
SomeObject& SomeOtherObject::constFoo();
以下内容不会编译(MSVC 9和gcc 3.4.4)

您可以通过丢弃常量来绕过上述错误:

SomeObject& SomeOtherObject::constFoo() const{
  return (SomeObject&)someObjectInstance;
}
但这当然打破了与代码用户的约定,即您不会更改SomeOtherObject实例

你也可以使一些ObjectInstance可变,以避免施放,但最终这并不是更好

成员方法上的const到底意味着什么

这意味着您承诺不修改函数中的任何不可变成员数据。换句话说,这意味着隐含的
指针指向
常量
对象

IMHO,返回对私有成员数据的非常量引用是一种糟糕的做法。它为您的类的用户打开了一扇门,可以在不通过公共接口的情况下修改其内部

成员方法上的const到底意味着什么

这意味着您承诺不会修改函数中任何不可变的成员数据