问题标签 [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 回答
779 浏览

c++ - 在 C++ 中,具有 const 数据成员的类可以没有复制赋值运算符吗?

我正在设计一个应该有一个名为 const 数据成员的类K。我还希望这个类有一个复制赋值运算符,但编译器似乎隐式地从任何具有 const 数据成员的类中删除了复制赋值运算符。这段代码说明了基本问题:

这是它产生的错误:

我想我理解编译器为什么这样做;我要复制到的类的实例必须先存在,然后才能复制到,K如果它是 const,我不能在该目标实例中分配,就像我在上面尝试做的那样。

我对这个问题的理解正确吗?如果是这样,有没有办法解决这个问题?也就是说,我可以为我的类定义一个复制构造函数并且仍然提供K类似 const 的保护吗?

0 投票
1 回答
50 浏览

c++ - 初始化对象和赋值给对象的区别

我正在做一些基本的对象练习,我遇到了这个问题。

此类名为 Matrix,我尝试将其初始化a7a2.mutiply(a5).

但是当我一开始尝试初始化并稍后a7分配它时,结果却大不相同。a2.mutiply(a5)

我以为这两个代码是一样的,但结果告诉我我错了。

有人可以帮我指出问题吗?

矩阵.h

源.cpp

结果.txt

0 投票
2 回答
239 浏览

c++ - C++ 单独赋值还是创建一个新对象?

如果我有一个glm::vec3例子,我想给它分配一个新值,以下哪种方法更快?

或者

如果我理解正确,第一种方法执行以下操作:

  1. 调用glm::vec3构造函数在堆栈上创建一个新的临时向量
  2. 调用复制赋值操作符glm::vec3来复制新向量

而第二种方法只是分配并避免创建一个虚拟的临时向量,那么为什么我想做大量的 *** 而不是仅仅分配我的值呢?

0 投票
1 回答
113 浏览

c++ - 重载赋值运算符不起作用

我有一个班级Employee。(当我添加成员任务和任务列表时,我的一些评论没有更新;对此我深表歉意。)

员工.h

员工.cpp

我们被指示实现复制构造函数和赋值重载,并且还特别指示我们在主程序中动态分配单个 Employee 对象。

我似乎遇到的问题是使用赋值重载进行交换。

员工驱动程序.cpp

有问题的问题似乎发生在这里:( *emp1 = *emp2;朝向主程序的底部),但我不知道为什么;任何帮助,将不胜感激。我可以绕过它,但我认为这不是练习的目的,我想知道为什么这个语句不能正常工作。

谢谢。

0 投票
4 回答
140 浏览

c++ - 在派生类中使用复制赋值

cppreference

因为总是为任何类声明复制赋值运算符,所以基类赋值运算符总是隐藏的。如果使用 using-declaration 从基类引入赋值运算符,并且其参数类型可以与派生类的隐式赋值运算符的参数类型相同,则 using-declaration 也被隐式隐藏宣言。

据我了解,以下代码不应编译。因为

  1. B::operator=(const B&) 是隐式声明的。
  2. A::operator=(const A&) 和 using-declaration 都是隐藏的。

但是,它编译成功并打印“A::operator=”,为什么?

0 投票
2 回答
128 浏览

c++ - 将新对象分配给其地址时,是否必须销毁对象?

考虑以下代码。

输出是我没想到的。

我知道那Thing 2是一个临时对象,这就是为什么它被摧毁了两次。我有几个关于发生了什么的问题Thing 0

  • 为什么没有Thing 0被销毁?
  • 会不会有内存泄漏?
  • 我必须以Thing 0某种方式破坏还是成功覆盖?
0 投票
0 回答
169 浏览

c++ - 复制和分配:如何深度复制?C++

我有两个类,它们本质上是看起来像这样的字符串类。第一个类包含一个字符串作为成员,第二个类还包含一个字符串以及一个用于“MenuItem”类的指针数组以及一个跟踪器。

我希望能够将一个 Menu 对象深度复制到另一个 Menu 对象,但我这样做的方式似乎确实是在复制“m_MenuItems”时它是一个浅拷贝。我确定“m_Title”成员正在被深度复制,因为我正在为它创建一个“新”字符*,但是当我尝试将源“m_MenuItems”复制到目标时出现问题,因为它们最终共享相同的记忆。这会导致问题,因为当调用解构函数时,它会在同一个对象上调用两次,导致我的程序崩溃。

这是我的副本和分配代码:

下面这个for循环是我的问题出现的地方......

我应该如何为目标“m_MenuItems”分配一个新的内存块?

0 投票
0 回答
65 浏览

c++ - 为什么 & 限定符与赋值运算符一起使用?

我的问题是参考以下链接:

为什么要使用 ref 限定符 & 声明已删除的赋值运算符

我应该为赋值运算符使用左值引用限定符吗?

我无法关注这些​​帖子。有人可以解释一下:

  1. &给定代码段末尾的实际作用是什么?auto operator=(const string& rhs) &;.
  2. 为什么&这个给定代码片段的末尾是多余的?(还请确认它是多余的还是有问题的)auto operator=(const string& rhs) & = delete;
  3. 这个陈述是否有效,auto operator=(const string&& rhs) &&;

如果限定符&阻止右值的复制分配,它是否已经被指定的输入参数的类型注意?( const string& rhs)。

在以下示例中,无论有无限定符,右值赋值都得到相同的结果。

0 投票
1 回答
59 浏览

c++ - 关于复制赋值和删除操作符的问题

我遇到了这个链接,我看到了这个程序:

现在我看到这个程序很好,除了这部分:

我不明白为什么我们必须在delete m_ptr这里做。此外,如果m_ptr还没有动态分配会发生什么?然后我们将删除一个无效的指针。我们不能像这样不删除指针就保持原样吗?

0 投票
2 回答
95 浏览

c++ - 无法生成 C4512 赋值运算符

我正在更新一个旧的 C++ 应用程序,它是用 MSVC 2013 编译的,而不是我知道的最新版本。

我收到警告:

这是类原型:

我以前没有看到过这个警告,我不确定它的实际含义是什么?