gpt4 book ai didi

c++ - C++ 中是否有隐式默认构造函数?

转载 作者:太空狗 更新时间:2023-10-29 23:10:44 24 4
gpt4 key购买 nike

在我目前正在阅读的书 ( C++ Without Fear ) 中,它说如果您不为类声明默认构造函数,编译器会为您提供一个,它“将每个数据成员清零”。我已经对此进行了试验,但没有看到任何归零行为。我也找不到任何在谷歌上提到这个的东西。这只是一个错误还是特定编译器的怪癖?

最佳答案

如果你没有定义构造函数,编译器会为你定义一个默认的构造函数。

build

这个的实现

默认构造函数是:

  • 默认构造基类(如果基类没有默认构造函数,则编译失败)
  • 默认按照声明的顺序构造每个成员变量。 (如果成员没有默认构造函数,则编译失败)。

注意:
POD 数据(int、float、pointer 等)没有明确的构造函数,但默认操作是什么也不做(在 C++ 哲学的风向标中;除非我们明确要求,否则我们不想为某些东西付费) .

复制

如果没有定义析构函数/复制构造函数/复制赋值运算符,编译器会为您构建其中之一(因此类总是具有析构函数/复制构造函数/赋值运算符(除非您作弊并显式声明一个但不定义它))。
默认实现是:

析构函数:

  • 如果定义了用户定义的析构函数,则执行提供的代码。
  • 以声明的相反顺序调用每个成员的析构函数
  • 调用基类的析构函数。

复制构造函数:

  • 调用基类复制构造函数。
  • 按照声明的顺序为每个成员变量调用拷贝构造函数。

复制赋值运算符:

  • 调用基类赋值运算符
  • 按照声明的顺序调用每个成员变量的复制赋值运算符。
  • 返回对此的引用。

注意 POD 数据的复制构造/赋值运算符只是复制数据(因此存在与 RAW 指针相关的浅复制问题)。

移动

如果没有定义析构函数/复制构造函数/复制赋值/移动构造函数/移动赋值运算符,编译器会为您构建移动运算符之一。
默认实现是:

隐式声明的移动构造函数如果没有为类类型(struct、class 或 union)提供用户定义的移动构造函数,并且以下所有情况都为真:

移动构造函数:

  • 调用基类复制构造函数。
  • 按照声明的顺序为每个成员变量调用移动构造函数。

移动赋值运算符:

  • 调用基类赋值运算符
  • 按照声明的顺序调用每个成员变量的移动赋值运算符。
  • 返回对此的引用。

关于c++ - C++ 中是否有隐式默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com