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