Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;——为什么我们要在这个构造函数中使用显式?_C++_Explicit Constructor - Fatal编程技术网

C++ C++;——为什么我们要在这个构造函数中使用显式?

C++ C++;——为什么我们要在这个构造函数中使用显式?,c++,explicit-constructor,C++,Explicit Constructor,请参阅 为什么在上下文的构造函数中使用显式是一个好的实践 谢谢,因为除非您真的想允许隐式转换,否则通常使用显式是个好主意。由于您不太可能在隐式转换中真正获益的情况下使用上下文对象,因此最好将其设置为显式好吧,显式构造函数总是安全的,但可能会带来不便显式确保在需要上下文的地方提供策略接口*时出现编译错误。在这样做时,它会阻止临时上下文的构建。这在某些情况下变得尤为重要,例如: 上下文获取指向的策略接口的所有权,并在析构函数中删除它 上下文构造/销毁执行其他代价高昂或不适当的操作 LI>隐式地消除

请参阅

为什么在上下文的构造函数中使用显式是一个好的实践


谢谢

,因为除非您真的想允许隐式转换,否则通常使用
显式
是个好主意。由于您不太可能在隐式转换中真正获益的情况下使用
上下文
对象,因此最好将其设置为
显式

好吧,显式构造函数总是安全的,但可能会带来不便<代码>显式确保在需要
上下文
的地方提供
策略接口*
时出现编译错误。在这样做时,它会阻止临时
上下文的构建。这在某些情况下变得尤为重要,例如:

  • 上下文
    获取指向的
    策略接口
    的所有权,并在析构函数中删除它
  • 上下文
    构造/销毁执行其他代价高昂或不适当的操作
  • LI>隐式地消除了某些操作,使其他操作变得模棱两可,而程序员可能考虑如何解决歧义更合适。(例如,如果试图比较
    上下文
    策略接口*
    时产生编译时错误,则会导致比较
    策略接口*
    s、
    策略接口
    s或
    上下文
    s?)
如果
上下文
实际上是
策略接口
的替代品,只需要一些小的日志记录或其他增强,那么允许隐式构造可能是合适的,就像
std::string
可以从
const char*
构造一样。当它们是明显独立的东西时,或者当
上下文
的生命周期应该存在于
策略接口
的任何给定用法之外,然后指定一个显式构造函数


(注意:这些指南相当粗糙-与其说是一个终点,不如说是一个起点-欢迎评论)

如果这不是一个使用显式
的好地方,那又是什么呢?@potatostater:任何地方都有一个类,它的名字不能在礼貌的同伴中大声说出。James的上述评论不必太认真;对于potatostater的幼稚初学者,只需定义构造函数而不使用显式即可。--谢谢
class Context
{
    private:
        StrategyInterface * strategy_;

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

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

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