C ++ - 我们为什么要在这个构造函数中使用explicit?

时间:2010-11-08 05:07:45

标签: c++ explicit-constructor

请参阅Wikipedia:Strategy Pattern (C++)

class Context
{
    private:
        StrategyInterface * strategy_;

    public:
        explicit Context(StrategyInterface *strategy):strategy_(strategy)
        {
        }

        void set_strategy(StrategyInterface *strategy)
        {
            strategy_ = strategy;
        }

        void execute() const
        {
            strategy_->execute();
        }
};

为什么在Context的构造函数中使用explicit是一个好习惯?

谢谢

2 个答案:

答案 0 :(得分:13)

因为除非确实想要允许隐式转换,否则使用explicit通常是个好主意。由于在真正从隐式转换获得任何内容的情况下,您不太可能使用Context对象,因此最好将其设为explicit

答案 1 :(得分:6)

嗯,显式构造函数总是安全的,但可能不方便。 explicit如果您提供StrategyInterface*预期Context,则会确保编译错误。这样做会阻止构建临时Context。这在某些情况下变得特别重要,例如:

  • Context获取指向StrategyInterface的所有权,并在析构函数中删除它
  • Context施工/销毁执行其他昂贵或不当行为
  • 它隐含地消除了一些操作的歧义,并使其他操作模糊不清,让程序员考虑如何解决模糊性可能更合适(例如,尝试比较ContextStrategyInterface*产生编译时错误,导致比较StrategyInterface*StrategyInterfaceContext s?)

如果Context实际上是StrategyInterface的替代品,只需要一些小的日志记录或其他增强功能,那么允许隐式构造可能是合适的,就像{{1可以从std::string构造。如果它们显然是独立的事物,或者const char*的生命周期应该超出任何给定的Context使用范围,那么就会显示一个显式的构造函数。

(注意:这些指南非常粗略 - 更多的是起点而不是结束 - 欢迎评论)