C++总是使用显式构造函数

oop*_*psi 35 c++ constructor defensive-programming explicit

阅读以下博客后:

http://xania.org/200711/ambiguous-overloading

我开始问自己"我不应该总是明确地定义我的构造函数吗?"

所以我开始阅读的不仅仅是发现这篇文章:

http://www.sjbrown.co.uk/2004/05/01/always-use-explicit/

这显示了另一个例子,也解释了他背后的想法.但当然这是博客的一个想法.

我很高兴听到你们中的一些人,你对这种态度的看法,你对这个主题的经验是什么,以及对于任何一种方式的一些例子都会很好.

Luc*_*ton 57

传统观点认为,应该标记构造函数采用一个参数(通过使用默认参数明确地或有效地)explicit,除非它们确实定义了转换(std::string可以从const char*后者的一个示例转换).你已经弄清楚了自己的原因,因为隐含的转换确实会使生活变得更加艰难.

一个可能明显的例外是复制构造函数.或者另一种方法是考虑大多数类型都可以从自身转换为自身,并且因此explicit大多数时候都没有标记复制构造函数.

虽然看起来标记所有其他类型的构造函数explicit并没有受到伤害,但我反对它.因为虽然explicit对C++ 03中的多个参数的构造函数没有影响,但它在C++ 11中确实有效.把它放入代码中:

struct foo {
    explicit foo(int i);
    foo(int i, int j);
    explicit foo(int i, int j, int k);
};

foo make_foo()
{
    /* Not C++11-specific: */
    // Error: no conversion from int to foo
    return 42;

    // Okay: construction, not conversion
    return foo(42);

    // Okay: constructions
    return foo(42, 42);
    return foo(42, 42, 42);

    /* C++11 specific: */
    // Error: no conversion from int to foo
    return { 42 };

    // Not an error, not a conversion
    return { 42, 42 };

    // Error! Constructor is explicit
    return { 42, 42, 42 };
    // Not an error, direct-initialization syntax
    return foo { 42, 42, 42 };
}
Run Code Online (Sandbox Code Playgroud)

我个人发现,在一个返回的函数中,foo我必须明确地返回它foo { 42, 42, 42 }.我不知道explicit是什么在保护我.我真的希望{ initializers... }语法的意思是"从给定的初始化器构造对象",并explicit在避免任何事情的同时解决这个问题.(因为在复制初始化的情况下{ i }归结为i- 大部分时间 - 我很乐意将其提升.)

所以我要说养成使用explicit一元构造函数的习惯,只有那些.

  • +1 C++ 11信息我不知道. (12认同)
  • @dureuill这是你的电话,作为班级作家,你是否想要建构是否明确是你的选择.差异默认参数make是相同的构造函数用于构造具有一个,两个或三个参数的作业.所有这些建筑形式都是明确的,或者都没有.对于更细粒度的控制,您必须将构造函数拆分为更多重载. (3认同)