当前位置: 首页 > 知识库问答 >
问题:

构造函数初始值设定项列表未调用复制构造函数 [重复]

商正浩
2023-03-14

所以我正在学习构造函数初始值设定项列表,我写了以下代码:

class Mango
{
  public:

  Mango(){cout<<"Mango::ctor()";}
  Mango(const Mango& other){cout<<"Mango::copy_ctor()";}
};

class Box
{
    public:

    Box() : mango(Mango()) //**doesn't call copy constructor**
    {
    }

    Mango mango;
};

int main()
{
  Box box; 

   return 0;
}

为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?

共有2个答案

龚国源
2023-03-14

正如宋元瑶在他出色的回答中已经解释得非常好,编译器可以在很多情况下优化复制构造函数的调用。

不过,我想解决您问题的另一部分,以防万一存在一些误解:

为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?

您的复制构造函数需要提供一个(const Mango

赏梓
2023-03-14

由于复制省略,此处省略了复制构造。此行为从 C 17 开始保证。在C 17之前,它不是强制性的;编译器是允许的,但不是执行复制省略1 所必需的

在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察的副作用。它们不需要存在或可访问,因为语言规则确保不会发生复制/移动操作,即使在概念上:

> < li>

在初始化中,如果初始值设定项表达式是prvalue,并且源类型的cv非限定版本与目标的类是同一类,则初始值设定项表达式用于初始化目标对象:

  T x = T(T(T())); // only one call to default constructor of T, to initialize x

这意味着,mango将直接由默认构造函数初始化。

[1]事实上,大多数实现也会在C 17之前执行复制省略。使用Gcc,您可以尝试在pre-C 17模式下使用-fno-elide-构造函数选项来禁用复制省略。

 类似资料:
  • 我相信现代C初始值设定项列表对于初始化对象非常有用,甚至不需要定义自己的构造函数: 但是,当我的类从另一个类继承时,这不起作用: 我尝试添加

  • 我有以下代码: 我希望输出是:“base constructor,test:50”,但事实并非如此,因为构造函数是在初始化之前调用的,没有错误或警告,它只是编译。 有什么方法可以让构造函数在之后被调用吗?或者这是总体上的糟糕设计? 我正在尝试将所有的init方法和它们的调用放入构造函数insted中,这个行为阻止了我这样做。

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对

  • 在.citydoor.imports.catalog.tools中打包;

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它