问题标签 [copy-assignment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5952 浏览

c++ - 数组成员的默认复制分配

我有一个类似于以下的类定义:

我刚刚进行了一个单元测试失败,它正在验证复制分配是否正常工作。令我惊讶的是,buffer[] 数组中间的一个字节被错误地复制了。

我的理解是,默认的复制赋值运算符执行按成员复制,而对于数组成员(不是指向数组成员的指针),则需要按元素复制数组。我弄错了吗?

我的直觉是,我被一个悬垂的指针咬住了,它踩在了我的数组中间。但是,当我将这些对象的向量复制到另一个向量中时,我会重复看到这种情况。

有人愿意告诉我哪里出错了吗?

编辑:

稍微扩展一下,这个类不是 POD 类型——它派生自几个抽象基类,因此有一个虚拟析构函数。但是,数组是唯一的数据成员,在单元测试中破坏的用法是:

0 投票
5 回答
362 浏览

c++ - 根据复制操作符或单独实施复制ctor?

这不是在 operator= 方面实现复制构造函数的重复,而是一个更具体的问题。(或者我喜欢这样想。)

介绍

给定一个像这样的(假设的)类:

我们不能通过默认生成的函数来复制它,因为您既不能复制构造也不能复制 NonCopyable 对象。但是,这部分对象是我们实际上对复制不感兴趣的实现细节。

为 this 编写交换函数也没有任何意义,因为交换函数可以复制 std::swap 所做的(减去 NonCopyable)。

因此,如果我们想复制这些对象,我们只能自己实现 copy-ctor 和 copy-operator。只需分配其他成员即可轻松完成。

问题

如果我们需要实现copy ctor和operator,我们应该根据copy operator来实现copy ctor,还是应该用初始化列表“复制”代码?

也就是说,给定:

我们应该写a)

或 b)

答案的可能方面是性能、可维护性和可读性。

0 投票
6 回答
3444 浏览

c++ - 实现提供了复制构造函数和赋值运算符

对于实现(编译器)不提供复制构造函数和复制赋值运算符的情况,我有一点困惑。

  1. 当我们在类中声明复制 ctor 和/或复制赋值运算符时。
  2. 有人说,当我们从具有私有复制 ctor 和/或复制赋值运算符的类派生时。

我对第二种情况有点迷茫,正是第二种情况。
a) 实现不会为您声明它们,因此您将收到编译时错误。
或者
b) 实现将声明和定义它们,但是当编译器定义的实现试图找到基类的方法时,我们会得到一个编译时错误。

我昨天接受了采访,我说它的(b)正在发生,但面试官不同意,他说它的(a)。

我尝试在 Microsoft C/C++ 14.00 和 gcc 4.4.5 中编译以下代码

微软编译器输出

gcc 编译器输出

所以我认为,实现会声明并定义它,但是当编译器定义的实现试图找到基类方法时,我们会得到一个编译时错误。如果我错了,请纠正我。

0 投票
3 回答
4758 浏览

ruby - Ruby 中的对象赋值

来自 c++ 背景,我对 Ruby 中的对象分配很好奇。对于以下对象分配应考虑哪些因素(如果有):

0 投票
4 回答
8781 浏览

c++ - C++ 对象实例化与赋值

这有什么区别:

和这个:

我预计第二个可能会调用构造函数两次,然后是 operator=,但它却只调用了一次构造函数,就像第一个一样。

0 投票
1 回答
1520 浏览

c++ - 对象数组的默认复制行为

如果我有一个以数组为成员的类:

我复制了它的一个实例:

array逐字节进行 memcpy 编辑还是Object::operator=逐元素复制?

0 投票
1 回答
111 浏览

c++ - 继承的加法赋值操作,如何返回正确的类型?

我有这个类来分解 N 维向量空间上的常见操作:

注意:我真的想分解尽可能多的代码,以尽量减少文档和测试的数量。

现在,我派生了两个类:

这些类对于加法和标量乘法(按分量操作)的行为相似;所以,我想在基本向量类中分解operator+=()和。operator*=()

我的问题是:如何返回正确类型的引用?

到目前为止,我所有的想法(如下所列)都不令人满意,我会很感激一些建议,谢谢!


想法 #1:使用 C++ 协变返回类型机制。但是,我必须在派生类中重载这些运算符——对吗?(这对我来说意味着重复测试。)

想法#2:去找模板?

想法#3:将代码分解为基向量中的私有成员,但随后我必须在派生类中添加更多函数(以及更多要测试的东西)

0 投票
2 回答
298 浏览

c++ - 奇怪的复制构造函数

使用以下 C++ 程序:

我得到以下结果:

谁能向我解释地址“0x28ff08”处的对象以及从地址“0x28ff04”处的对象构造的相关副本会发生什么?我真的不明白为什么在这里调用复制构造函数。


我不知道我是否正确,因此我想进一步详细解释它。谁发现我的错误请指出。

首先,一张图片说明了执行流程的细节: 执行流程

(1)。创建一个a值为 1 的对象;

(2)。调用函数f()。创建一个对象temp,编译器发现该对象会被返回,所以直接在调用者的栈中创建;

(3)。通过调用;将f()(ie, )temp的返回对象赋值给 objectaoperator=()a

(4)。对象使用相同的变量名作为参数(右值)a传入。operator=()a

(5)。该方法operator=()main::a(左值,滥用符号)上调用,因此this在函数中指向main::a,[!!这是让我感到困惑的部分];

(6)。operator=()改变main::atoa的值(即从 1 到 2);

(7)。编译器发现返回类型不是引用,并且*this已经存在于 中main(),所以只好*this调用拷贝构造函数进行拷贝。但是,复制构造函数不会初始化对象,因此会创建一个未初始化的对象。

(8)。[!!不太确定这部分]左值和结果对象是同一个对象,因此由于优化,没有真正返回对象。

(9)。复制的对象被销毁,根据@Mike Seymour 的说法,创建这个对象是因为编译器不能省略它,因为构造函数和析构函数实际上都做了一些事情(例如输出值和地址)。

(10)。退出时operator=(),对象a被销毁。

(11)。退出时main(),对象main::a最终被销毁。

以上解释了输出,但是,我目前的理解可能不正确。如果我错了,请帮助我理解这一点。非常感谢。

0 投票
1 回答
341 浏览

c++ - 自定义复制赋值运算符使程序崩溃(C++)

我正在创建一个用于自动清理内存的自定义类。该类包含一个指向 SDL_Surface 对象的指针,并在需要时调用它的 refcount。问题是当我实现自定义复制分配运算符时,系统崩溃并出现以下代码:

“xyz.exe 中 0x771a15de 处未处理的异常:0xC0000005:访问冲突读取位置 0xcccccd04。”

并且对象属性“address”突然获得值“0x0000ffff”,同时使用默认的复制赋值运算符它运行得很好。

0 投票
1 回答
155 浏览

c++ - 在 C++ 中,将基类作为复制构造函数的构造函数是否算作复制构造函数?

例如:

  1. 显示的构造函数是否算作复制构造函数?
  2. 显示的赋值运算符算作复制赋值运算符吗?