问题标签 [default-copy-constructor]

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 回答
50 浏览

c++ - 为什么我的类工作正常,即使返回垃圾值作为赋值运算符和空复制构造函数的返回?

  1. 我已经覆盖了默认的复制构造函数和赋值运算符,只打印而不返回任何东西。
  2. 然而,该类工作正常,即它被正确复制和分配。
  3. 如您所见,display()方法也被正确调用。(我期待崩溃或分段错误,因为复制构造函数和赋值运算符被覆盖并且什么都不做。
  4. 我已经用不同的编译器(包括在线编译器)编译了相同的内容,但输出仍然保持不变。

我的问题:为什么类工作正常?不显示任何错误?我期待它崩溃或出现故障,例如输出垃圾值。

'

在 Windows 10 和其他编译器上使用 g++(Mingw 编译器)的代码的输出也是:

0 投票
2 回答
164 浏览

c++ - 用 C++ 中的所有元素复制对象!(构造函数和赋值,最佳实践?)

我翻遍了 SO 并学到了很多关于默认构造函数、复制构造函数、对象分配、智能指针、浅/深复制以及它们与动态内存分配的关系(例如ThisThisThat和 ...)。但是,对于最佳实践是处理复制对象元素(例如向量(或列表))的结论,我仍然很模糊。

我特别学习了 STL 向量,它通过其默认的复制构造函数来处理这个问题,在这种情况下,最好的做法是不要自己管理资源。但似乎我理解错了。

问之前我的努力:我也能够通过引用传递对象来解决这个问题,但我最终拥有太多的尊重运算符(即**)。

对于简单的小对象(例如以下代码中的对象),这里的最佳做法是什么?向量中的元素未正确复制。(如果我在这里犯了非常简单的错误,我不会感到惊讶。此外,如果可能,最好不要使用原始/共享/智能指针)。

0 投票
2 回答
121 浏览

c++ - 为什么 defaulted-move-ctor 会抑制implicit-copy-ctor 而不是 default-copy-ctor?

我似乎遇到了一个示例,在该示例中,根据情况,默认的移动构造函数似乎既可以算作用户声明的,也可以算作非用户声明的:

结果是:

编译器错误是预期的,因为 cppreference 告诉我们:

如果满足以下任一条件,则类 T 的隐式声明或默认复制构造函数被定义为已删除:
[...]
T 具有用户定义的移动构造函数或移动赋值运算符;

请注意,默认构造函数在这里显然算作“用户声明”。但是,如果我们现在从第 4 行删除注释,从而显式默认复制构造函数,程序将编译而不会出错,即使我上面引用的语句指定:

隐式声明或默认的复制构造函数

这似乎是一个矛盾。这是 cppreference 中的错误还是我只是感到困惑?

0 投票
1 回答
83 浏览

c++ - 我可以使用仅提供复制构造函数的类创建类对象吗?

是否可以创建仅提供 copy-ctor 的类的实例?或者,如果删除所有其他ctors,那么删除一个copy-ctors是否是好的设计?

0 投票
4 回答
235 浏览

c++ - 复制构造函数如何执行?

我正在尝试详细了解复制构造函数。在这样做的同时,我做了以下示例,

我在网上读到默认复制构造函数执行“浅复制”所以这意味着如果 obj1 = obj2,我在 obj1 或 obj2 中所做的任何更改,即使在分配需要反映在两个对象上,因为它们指向相同的位置。但是在这个例子中,当我改变一个对象的值时,它不会反映在另一个对象中。使用用户定义的复制构造函数时获得相同的结果。

有人可以澄清这个话题,浅拷贝是否正在发生!

谢谢!

0 投票
5 回答
235 浏览

c++ - 编译如何选择调用哪个构造函数?

这是我的代码。

当我删除第 11 行时,输出是

关于最后一行“A(1)”,为什么调用 A 类的第二个构造函数?

0 投票
0 回答
63 浏览

c++ - C++ 初始化列表和复制构造函数

我在使用 {} 语法和复制构造函数时遇到了问题。根据 Stroustrup 的以下代码应该可以工作(我检查了他的书,他多次做了同样的例子)但是当我尝试用 gcc 编译它时它失败了(它编译并与 clang 一起工作):

编译错误是:error: cannot convert 'A' to 'int' in initialization

显然它正在尝试使用初始化列表作为参数列表(因此尝试将 struct A 分配给 int),但根据语言规范,应该可以使用 {} 调用复制构造函数(实际上它适用于铛)。

这是gcc的特性吗?我错过了什么吗?

编辑:找到的解决方案:这似乎是标准中的一个错误,应该在 C++14 中修复(查看此处的“勘误表”部分:http: //stroustrup.com/4th.html

0 投票
2 回答
51 浏览

c++ - 弹出“调试断言失败”

我不知道出了什么问题,我需要定义一个构造函数还是只保留一个复制构造函数?我认为这是关于浅拷贝和深拷贝的问题。请帮忙,谢谢。 调试的时候弹出这个窗口

0 投票
2 回答
124 浏览

c++ - 为什么类中的 ostringstream 类型的成员会导致“调用隐式删除的复制构造函数”错误?

我已经将“调用隐式删除的复制构造函数”编译错误的问题隔离到在声明类成员时使用 ostringstream 类型。在下面的示例中,定义了示例的 Reading 类的对象的 STL 列表。在调用 push_back 时,编译器搜索复制构造函数,但编译失败,似乎是因为 Readings 的复制构造函数已被隐式删除。

当我注释掉引用payloadString的两行时,程序编译。

我在想我的问题可能是 ostringstream 是引用类型,如下所述:

https://en.cppreference.com/w/cpp/language/copy_constructor “T 有一个右值引用类型的数据成员;” 被引用为隐式删除复制构造函数的可能原因之一。

Q的。谁能确认我上述关于 ostringstream 是导致问题的引用类型的假设是否正确?

我使用 ostringstream 的原因在这个人为的例子中并不明显。也许我需要找到另一种方法来处理这个字符串,但是任何人都可以建议一种可以在这里工作的方法吗?

0 投票
1 回答
55 浏览

c++ - 如何返回一个类的两个对象相加的结果

在编译时,当它返回添加对象的结果时,它sme error就像使用删除函数一样。constexpr Player::Player(const Player&)