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

c++ - 在 C++0x 中,非静态数据成员初始化器会覆盖隐式复制构造函数吗?

根据与相关的N2628,非静态数据成员初始化程序可以被显式定义的构造函数覆盖,但对于隐式定义的复制构造函数似乎有点模糊。

特别是,我注意到在 Apple clang 3.0 版中,行为会根据结构(或类)是否为 POD 而有所不同。

以下程序返回输出“1”,这表明复制构造函数忽略右侧,而是替换新的非静态数据成员初始值设定项(在本例中,X::a 的布尔真值)。

但是,令人困惑的是,如果您注释掉 string1:

然后行为按我的预期工作(输出为“0”),大概是因为没有隐式生成的复制构造函数,因此数据被复制

C++0x 规范是否真的建议允许隐式定义的复制构造函数复制右侧的内容是个好主意?这不是不太有用和不直观吗?我发现非静态成员初始化器功能非常方便,但如果这是正确的行为,那么我将明确避免该功能,因为它的行为棘手且不直观。

请告诉我我错了吗?

更新:此错误已在 Clang 源存储库中修复。请参阅此修订版

更新:这个错误出现在 Apple clang 3.1 版(tags/Apple/clang-318.0.45)(基于 LLVM 3.1svn)中。这个版本的 clang 作为 Xcode 4.3 for Lion 的一部分分发。

0 投票
6 回答
41308 浏览

c# - C#结构的自动深拷贝

我有一个结构,MyStruct它有一个私有成员private bool[] boolArray;和一个方法ChangeBoolValue(int index, bool Value)

我有一个类,MyClass有一个字段public MyStruct bools { get; private set; }

当我从现有对象创建新的 MyStruct 对象,然后应用方法 ChangeBoolValue() 时,两个对象中的 bool 数组都发生了更改,因为引用而不是引用的内容被复制到了新对象。例如:

有没有办法强制副本实现更深的副本,或者有没有办法实现这个不会有同样的问题?

我专门将 MyStruct 设为结构,因为它是值类型,并且我不希望引用传播。

0 投票
2 回答
191 浏览

c++ - 如果我用非常量参数定义了复制构造函数和 operator=,我还会得到默认的复制构造函数和 operator= 吗?

在 C++ 中,如果我定义了一个复制构造函数和 operator= 对类进行非常量引用,编译器是否应该仍然为 const 引用提供默认版本?

0 投票
4 回答
951 浏览

c++ - 未声明的复制构造函数会自动内联吗?

未声明的(自动生成的)复制构造函数是否自动标记为inline

如果是这样,并且如果我不希望它们被标记为inline,这是否意味着我必须手动定义一个并手动复制我需要的每个成员(假设我没有使用 C++11,所以没有= default从中获利)?

0 投票
5 回答
581 浏览

c++ - c++拷贝构造函数相关查询

为什么答案返回为 5 ,默认情况下 C++ 中的复制构造函数返回浅拷贝。浅拷贝不就是引用吗??还是我错过了什么?

0 投票
1 回答
530 浏览

c++ - 复制构造函数定义和声明的区别?

我有一个类 Base 和 Class derived 。

  1. 如果我在我的类中声明一个复制构造函数,编译器会在编译时定义复制构造函数吗?
  2. 如果调用 Derived 类的复制构造函数会发生什么?它是否依赖于基类复制构造函数?

(在标准编译期间,我需要知道基类和派生之间的关系在复制构造函数方面。编译器是做什么以及如何定义复制构造函数)

0 投票
2 回答
339 浏览

c++ - 为什么不调用复制构造函数?

抱歉标题过于模棱两可。(由于我的英语能力不足)。请推荐一个更好的标题。

请考虑以下代码。

Gcc 4.8.0 无法通过错误消息编译它 error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)

我不明白为什么这段代码是错误的。在我看来,编译器应该在行中调用复制构造函数A b = a;

但是,如果我用注释的构造函数替换构造函数(它只接受值)。它确实编译。此外,现在不需要默认复制(和移动)构造函数的行。这里会发生什么?

0 投票
2 回答
388 浏览

c++ - 为什么这个复制构造函数是必要的

最近我遇到了一个问题,我把它变成了这个代码片段。

本质上,B 类是 A 类对象的容器。

实际代码中A要大很多,同一个A类型的对象可能会在容器中出现多次,所以为了节省空间,B只存储指向A的指针。

B::push 函数将 A 类型的对象提供给容器。

它们为 A 的指针和值重载。

主函数末尾的 while 循环是我想要的(有点像流操作符与 iostream 对象一起使用)。

B 中的迭代器“currA”跟踪函数调用 B::get_A() 最后返回的元素,因此对该函数的连续调用返回 B::content 中的所有 A 对象,直到到达末尾。在这种情况下,内部迭代器被重置,并返回一个带有内部无效标志的对象 A(在这种情况下,为了简单起见,A::number 为 0)。

该程序的输出可能如下所示:

主函数实例化两个对象 A a1(1) 和 A* a2(2)。

测试 A::get_number() 显示它们的两个内部值。两者都按预期工作。但是在我们将它们都放入容器并再次从中检索它们之后,只有 a1 正确显示。a2 的内容只显示了一些随机数。

起初我想,我在一些指针上犯了一个错误,但它证明如果一个人像这样声明并定义类 A 的复制构造函数,问题就解决了:

据我了解,复制构造函数将由 c++ 编译器隐式定义,如果没有提供并且建议实现它,当类有指针作为成员以避免浅拷贝时。但在这种情况下,A 只有一个 int。

我还尝试通过摆脱 B::get_A() 并通过其他方式获取容器内容来简化代码。即使没有实现默认构造函数,问题也消失了。所以这是我的问题:

1.) 编译器定义的复制构造函数不是和我提供的类似吗?

2.) 复制构造函数与实际问题有什么关系?实现复制构造函数如何解决问题?

0 投票
1 回答
74326 浏览

c++ - 调用 LLVM 中隐式删除的复制构造函数

根据 C++11 规则,默认生成 6 个东西(默认构造函数、复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数)。根据第二条规则,当定义了任何自定义复制、移动或析构函数时,不会生成这些默认操作。但在我后面的代码中,情况并非如此。但是此代码无法编译并出现错误

当我为 Uni 编写自己的复制构造函数时,一切正常。(代码中有注释,供参考)

任何想法都非常感谢。

最后,我在 Mac 上运行这个,Xcode 和 LLVM 编译器。

非常感谢...

0 投票
4 回答
2717 浏览

c++ - 为什么在复制构造函数中使用&符号?

为什么我们通过引用传递一个类的对象。当我删除与号 (&) 时,我收到以下错误。

这是什么意思?可能是编译器没有考虑给定复制构造函数并使用默认构造函数。如果是这种情况,为什么要调用默认构造函数。简而言之,为什么我们使用 & 符号,会发生什么?如果我们不这样做。