用户定义的构造函数和隐式默认构造函数

时间:2013-07-20 10:28:10

标签: c++ constructor default value-initialization

我一直在阅读此页面以了解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization

  

值初始化的影响是:

     
      
  • 如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数。
  •   

但这似乎与其他来源直接矛盾,解释说如果至少有一个用户定义的构造函数,那么编译器不会生成隐式默认构造函数(像“T t;”这样的表达式将无法编译) 。欢迎任何解释。

1 个答案:

答案 0 :(得分:3)

此上下文中的“默认构造函数”表示不能接受任何参数的构造函数(因为它没有参数,或者因为它只有可选参数)。

“隐式构造函数”表示自动为您生成的构造函数。这可以是无参数构造函数,复制构造函数或(从C ++ 11开始)移动构造函数。

所以,没有矛盾。当T是具有用户提供的构造函数的类类型时,值初始化将调用默认构造函数。如果这不存在(因为你定义了另一个构造函数但没有no-args构造函数),或者它是不可访问的(因为你将它标记为私有或受保护,然后从一个地方使用它而不能使用这些函数),那么值初始化格式错误,编译器将拒绝您的代码。如果它已声明但从未定义,则程序将不会链接。

从C ++ 11开始,单词“default”可能有些含糊不清,因为可以定义一个复制构造函数= default;