gpt4 book ai didi

c++ - 使用带有 new 运算符的列表初始化

转载 作者:行者123 更新时间:2023-12-02 10:11:39 25 4
gpt4 key购买 nike

背景
考虑以下代码片段:

MyClass * p1 = new MyClass;
p1->data = 1;
MyClass c2 = MyClass();
p2.data = 2;
new(p1) MyClass {c2};
cout << p1.data;
在哪里 MyClass仅包含单个公共(public)成员 int data .
前 4 行很简单:我们创建了两个 MyClass 对象,一个使用 new一个没有。下一行发生的是 c2 的内容。被复制到 p1 ,意味着最后一行的输出是 2 .
我的问题是关于 new(p1) MyClass {c2}; 线上到底发生了什么。 .我的理解是有两个操作:一个 new和一个列表初始化器。对于 new , 基于 this , 如果您调用 new使用指针作为参数,它不分配任何新内存,只是在给定指针的位置构造一个对象,指针为 new运算符的返回值。这意味着 new(p1) MyClass解析为指向与 p1 相同地址的指针.然后,列表初始化 {c2}用于设置 p1处的内容至 c2 ,这就是为什么最后的输出是 2 , 而不是 1 .
问题:
这是对正在发生的事情的正确理解吗?
如果是这样,我有一点困惑是 new接线员 new(p1) MyClass应该解析为指针,但看起来我们正在分配 c2指向它的不是指针,而是一个整体 MyClass目的。这里发生了什么?
最后,我想知道使用这种语法背后的动机是什么。我是来自 C 的 C++ 新手,在 C 中您只需编写类似 *p1 = c2; 的内容完成与 new(p1) MyClass {c2}; 相同的事情

最佳答案

你所问的问题有很多组成部分。主要的两件事是

  • 3 规则(如果您在现代 c++ 中包含移动语义,则为大 5)
  • 内存管理

  • 首先,当您使用 关键字 用于在 Free Store/Heap 区域创建对象分配内存然后构建它。此处创建的对象即使在程序终止后仍保留在此处,并且必须使用关键字 删除删除 .
    根据这个逻辑, p1 对象存储在免费存储中。
    就你第 5 行的前半部分而言
    new(p1) 
    new 的这种用法确实 不是 分配内存,但实际上在 的位置构造对象p1 .
    下半场...
    MyClass {c2};
    负责调用对象的构造函数,并根据c2的属性构造所述对象(也称为拷贝构造函数)。
    举个很好的例子,这里是 C++ 中 new 运算符的文档链接: http://www.cplusplus.com/reference/new/operator%20new/
    复制构造函数的这个想法是 的一部分。 3 法则 如下:
  • 析构函数(用于销毁对象的函数)
  • 复制构造函数(第 5 行中用于创建新对象的内容)
  • 复制赋值运算符(重载 = 运算符以创建新函数,即 Obj1 = Obj 2)。

  • 我建议研究这些概念以进一步了解 C++ 中的对象行为。其中大部分已经为 C++ 中的所有对象预定义。但是,您始终可以覆盖其中任何一个以满足您的对象需求。
    重要提示:如果您覆盖 C++ 为您提供的任何默认大 3,则必须覆盖所有它们,因为可能存在差异。
    这是一个很好的幻灯片,可以帮助您深入了解 Big 5 的主题(另外两个与现代 C++ 中的移动语义有关,但前三个幻灯片主题详细介绍了 Big 3): https://www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf

    关于c++ - 使用带有 new 运算符的列表初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63320678/

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