为什么C ++“知道”制作大量副本?

时间:2014-04-27 05:00:41

标签: c++ styles copy

最近,我碰到了一个旧的(但仍然很有趣)" If Programming Languages Were Essays"漫画。我对它上面的大多数语言非常熟悉,但我对C ++上的语言感到有点困惑。

最近刚刚开始使用C ++,我不能完全确定为什么C ++以制作大量的对象副本而闻名。我去做了一些研究,发现当参数按值传递时,会传递对象的副本。但是,很多语言都默认值传递,所以我不认为我能找到正确的理由。同样,我进入了复制构造函数以及C ++如何(与Java不同)是一个执行浅拷贝的默认复制构造函数,但这并不能让我相信。

任何人都可以对这个C ++概念有所了解吗?

2 个答案:

答案 0 :(得分:3)

按值传递并按值返回是C ++从C继承的东西。它很简单,因为C(结构)中的数据类型本质上是数据包。使用函数指针进行一些黑客攻击可以获得“成员函数”,但它与C ++中的结构并不完全相同。

但是,从新标准来看,移动语义可以实现“移动”而不是复制。将对象从一个位置移动到另一个位置涉及使用std::move将其向下转换为右值引用,然后将其传递给移动构造函数或接受右值引用的移动赋值运算符。

但是,将对象从一个地方移动到另一个地方会使其处于有效但未知状态的“原始”状态。例如,将std::string个对象从一个地方移动到另一个地方(即另一个变量)会使“原始”成为空字符串。

答案 1 :(得分:2)

对于默认情况下将所有内容都作为参考的语言,按值传递不是问题。

但是在C ++中,参数默认为值类型,除非您明确指定它们是通过引用获取的。

此外,除非赋值运算符被覆盖以执行其他操作,否则每个赋值都会发生完整拷贝。

class  Foo {
    int a;
    double d;
    uint64_t z;
}

Foo foo; 
Foo bar = foo; // just made a copy of all of the guts of Foo.

在Java中,那将分配一个引用。