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

Posted

技术标签:

【中文标题】用户定义的构造函数和隐式默认构造函数【英文标题】:User-defined constructors and implicit default constructors 【发布时间】:2013-07-20 10:28:09 【问题描述】:

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

值初始化的效果是:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

从 C++11 开始,“默认”这个词可能有点模棱两可,因为可以定义一个复制构造函数 = default;

【讨论】:

而且,如果调用了某些东西但不存在,则程序不会编译。它仍然是调用,只是因为它丢失了一个错误。

以上是关于用户定义的构造函数和隐式默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++用户定义的空默认构造函数与隐式或默认的默认构造函数

实例模拟和隐式构造函数

我定义了一个非拷贝构造函数;复制构造函数是不是仍会被隐式定义?

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

C++:explicit关键字

C++ explicit关键字