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

q09*_*987 3 c++ explicit-constructor

请参考维基百科:策略模式(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();
        }
};
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jer*_*fin 13

因为explicit除非你真的想要允许隐式转换,否则使用它通常是一个好主意.因为Context在你真正从隐式转换中获得任何东西的情况下你不太可能使用对象,所以你最好不要使用它explicit.


Ton*_*roy 6

好吧,显式构造函数总是安全的,但可能不方便. explicit如果您提供预期的StrategyInterface*位置,Context则确保编译错误.这样做可以防止构建临时的Context.这在某些情况下变得尤为重要,例如:

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

如果a Context实际上是a的替代品StrategyInterface,只需要一些小的日志记录或其他增强功能,那么允许隐式构造可能是合适的,就像std::string可以构造一样const char*.当它们显然是独立的东西,或者当a的生命周期Context超出任何给定的使用范围时StrategyInterface,则表明显式的构造函数.

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