Pat*_*ick 12 c++ const interface
我有一个模块执行一些计算,在计算过程中,与其他模块通信.由于计算模块不想依赖其他模块,因此它会公开这样的接口(当然这是一个非常简化的版本):
class ICalculationManager
{
public:
double getValue (size_t index) = 0;
void setValue (size_t index, double value) = 0;
void notify (const char *message) = 0;
};
Run Code Online (Sandbox Code Playgroud)
想要使用计算模块的应用程序需要编写自己的接口实现,并将其提供给计算工具,如下所示:
MyCalculationManager calcMgr;
CalculationTool calcTool (calcMgr);
calcTool.calculate();
Run Code Online (Sandbox Code Playgroud)
我现在想知道将"const"添加到ICalculationManager接口的方法是否有意义.
似乎合乎逻辑的是,getValue方法只能得到一些东西并且不会改变任何东西,所以我可以制作这个const.并且setValue可能会更改数据,因此不会是const.但是对于像通知这样更通用的方法,我无法确定.
事实上,对于所有方法,我现在可以确定该方法实际上是作为const方法实现的,如果我将接口方法设为const,我强制所有实现也是const,这可能不是通缉.
在我看来,如果你事先知道你的实现是什么以及它是否是常量,那么const方法才有意义.这是真的?
制作这种接口const的方法是否有意义?如果它有意义,那么确定方法是否应该是const的好规则是什么,即使我不知道实现是什么?
编辑:将参数从通知从"char*"更改为"const char*",因为这会导致无关的答案.
const
当您向客户广告时,您可以创建一个函数,调用该函数永远不会更改对象的外部可见状态.您的对象只有一个可以检索的状态getValue.
因此,如果getValue可以导致下一个getValue返回不同的值,那么请确保将其保持为非const.如果你想告诉客户端调用getValue()永远不会改变下一个getValue()返回的值,那么将它设为const.
通知相同:
double d1 = mgr->getValue(i);
mgr->notify("SNTH"); // I'm cheating.
double d2 = mgr->getValue(i);
assert(d1==d2);
Run Code Online (Sandbox Code Playgroud)
如果对于所有情况都应该成立,那么我所有的则notify()应该是const.否则不应该.