3

其中C++,我们有Copy ConstructorDestructors重载=,它们一起被称为复制控制

我的问题是:

  1. copy constructor用于在传递给函数时初始化对象 asC#when argument (initializing分配)来自returninga 的对象function C++

  2. 当我们将任何对象分配而不是初始化)相同类型的另一个对象时,是否=会调用隐式重载的运算符函数?

4

4 回答 4

1

在 C# 中,您不能重载赋值运算符。

析构函数在托管内存世界中(大多数时候)没有真正意义。实际上有一个等价物(终结器),但您应该很少需要使用它们。

复制构造函数是为某些类创建的,但它不像在 C++ 中那样频繁。它永远不会被语言隐式调用,它只会在你手动调用它时使用。

于 2012-12-13T15:01:21.837 回答
1
  1. 否:引用对象是按引用传递的,而值对象是逐字节复制的。您可以制作自己的“复制构造函数”,但您将负责显式调用它们。
  2. 您不能重载赋值运算符

对 C# 公平地说,由于底层的垃圾收集内存模型,C++ 复制控制的复杂性都不是必需的。例如,复制对象时不需要控制动态分配对象的所有权,因为您可以随意拥有对动态对象的任意数量的引用。

于 2012-12-13T15:02:22.913 回答
1

不,如果你想提供复制机制,你可以通过实现 ICloneable 接口来做到这一点:http: //msdn.microsoft.com/en-us/library/system.icloneable.aspx

于 2012-12-13T15:03:05.787 回答
1

C# 没有复制构造函数的概念,也没有重载的概念operator=。在 C# 中,对象只是存在,您在代码中使用它们的句柄。句柄可以“按值”复制以在整个代码中使用,但这是所谓的“浅”复制,对象本身仍然相同,它们都指向相同的内存(间接地)。

复制构造函数类似于托管世界中的深度复制,您可以通过ICloneable. 您也可以通过序列化(boost方式)或通过任何方式的间接方式来实现它。

最后一点,由于对象的生命周期是不确定的(当 GC 任意决定它们应该死亡时它们就会死亡),所以也不存在析构函数之类的东西。最接近的是终结器(当您的对象被收集时被称为非确定性的)和IDisposable模式(与 一起using),它使您可以控制终结器。不用说它们很少使用。

编辑:我应该指出,虽然复制构造函数没有等价物,但您确实有“类型转换”构造函数implicit,确切的名称目前让我无法理解。

于 2012-12-13T15:06:52.513 回答