代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

使构造函数显式化是一种好的做法吗

c++
  •  8
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    在设计公共API时,将构造函数显式化是一种好的做法吗?

    class A {
    public:
        //explicit A(int i){}
        A(int i){}
    };
    
    void fun(const A& a) {}
    
    int main() {
        // If I use explicit for A constructor, I can prevent this mistake.
        // (Or shall I call it as feature?)
        fun(10);
    }
    

    或者我应该允许隐式转换,允许用户以更少的类型调用我的API?

    5 回复  |  直到 5 年前
        1
  •  9
  •   Björn Pollex    14 年前

    int 到一个 A ?). 少打字不应成为指导这一决定的标准。考虑可读性(这是隐式转换的主要参数)以及代码的理解程度。不直观的隐式转换会让代码的读者挠头。

    附言:我现在似乎还不能想出一个好的例子,所以任何帮助都是非常感谢的。

        2
  •  5
  •   Chubsdad    14 年前

    This 是我从“丹尼尔·克格勒”的反应中发现的

    如果我们已经开始设计C++ 从今天开始,有一个好的 所有的建设者和 默认情况下,但是用户可以 “隐式”。唉,时间不可能 回头我们就得一起生活 当前状态。这意味着我们 隐式构造函数(除了 复制/移动构造函数)。这是一种更安全的方法 使构造函数显式的规则, 某种形式的转换 涉及(即任何 实际类型T)。

        3
  •  5
  •   Ralph    14 年前

    是的,默认情况下,可以使用一个参数调用任何构造函数 很难找到。

    • 围绕一个参数类型的包装器的语义。

    • 复制构造函数不应该是显式的(否则会丢失 传递值调用的可能性)。

        4
  •  1
  •   Alex F    14 年前

    显式构造函数用于类中,类消耗大量资源,如内存、构造时间等,以防止用户意外地创建此类类的实例。由您自己决定,您的类是否足够“重”以使用显式构造函数。

        5
  •  1
  •   Puppy    14 年前

    这取决于所涉及的成本,包括语义和性能。如果你的类的创建是昂贵的,你应该防止它被意外实例化。如果创建的类很便宜,那么隐式构造可以大大简化API用户的工作。