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

平常我

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

值初始化的影响是:

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

但这似乎与其他资料直接矛盾,这说明如果至少存在一个用户定义的构造函数,则编译器不会生成隐式默认构造函数(不会编译类似“ T t;”的表达式)。欢迎任何解释。

史蒂夫·杰索普

在此上下文中,“默认构造函数”是指不能接受任何参数的构造函数(要么因为它没有参数,要么因为它只有可选参数)。

“隐式构造函数”是指自动为您生成的构造函数。这可以是一个无参数的构造函数,一个副本构造函数或(从C ++ 11开始)一个move构造函数。

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

由于C ++ 11,“默认”一词可能有点含糊,因为可以定义一个拷贝构造函数 = default;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

默认构造函数与隐式构造函数

调用隐式删除的默认构造函数

Java错误:未为默认构造函数定义隐式超级构造函数

模板推导和隐式构造函数

构造函数异常和隐式删除

隐式转换和复制构造函数

实例模拟和隐式构造函数

隐式构造函数与“空”构造函数

默认(用户定义)构造函数和带有默认参数的构造函数之间的区别?

对于默认构造函数,未定义隐式超级构造函数Num()。必须定义一个显式构造函数,这背后的逻辑是什么

隐式与显式默认构造函数调用

C ++ 11:默认构造函数:隐式还是显式?

子类构造函数上的“ this”关键字是否需要隐式定义超类默认构造函数?

构造函数隐式删除

Scala隐式构造函数

C ++对象声明,没有默认构造函数(用户声明或隐式声明)

默认和显式构造函数

隐式定义与显式声明的构造函数

AngelScript - 避免运行隐式默认构造函数

为什么C ++隐式调用父默认构造函数?

C ++隐式默认构造函数的意义是什么?

C ++隐式和显式继承构造函数调用

默认构造函数无法处理异常类型隐式超级构造函数引发的异常

复制构造函数隐式定义为Deleted的情况

为什么带有用户声明的析构函数的类具有隐式默认构造函数?

当存在用户定义的析构函数时,如何禁用隐式定义的副本构造函数的生成

模板和隐式构造函数的类定义之外的Friend声明

隐式移动构造函数和赋值运算符

隐式声明的副本构造函数与隐式定义的副本构造函数之间有什么区别?