q09*_*987 3 c++ explicit-constructor
class Context
{
private:
StrategyInterface * strategy_;
public:
explicit Context(StrategyInterface *strategy):strategy_(strategy)
{
}
void set_strategy(StrategyInterface *strategy)
{
strategy_ = strategy;
}
void execute() const
{
strategy_->execute();
}
};
Run Code Online (Sandbox Code Playgroud)
为什么在Context的构造函数中使用explicit是一个好习惯?
谢谢
Jer*_*fin 13
因为explicit除非你真的想要允许隐式转换,否则使用它通常是一个好主意.因为Context在你真正从隐式转换中获得任何东西的情况下你不太可能使用对象,所以你最好不要使用它explicit.
好吧,显式构造函数总是安全的,但可能不方便. explicit如果您提供预期的StrategyInterface*位置,Context则确保编译错误.这样做可以防止构建临时的Context.这在某些情况下变得尤为重要,例如:
Context获取指向的所有权StrategyInterface,并在析构函数中删除它Context 建造/销毁执行其他昂贵或不适当的行动Context和StrategyInterface*产生编译时错误,导致比较StrategyInterface*s,StrategyInterfaces还是Contexts?)如果a Context实际上是a的替代品StrategyInterface,只需要一些小的日志记录或其他增强功能,那么允许隐式构造可能是合适的,就像std::string可以构造一样const char*.当它们显然是独立的东西,或者当a的生命周期Context超出任何给定的使用范围时StrategyInterface,则表明显式的构造函数.
(注意:这些指南非常粗略 - 更多的是起点而不是结束 - 欢迎评论)