在C++
中,我们有复制构造函数,析构函数,重载= ,它们一起被称为复制控件< /强>
我的问题是:
copy constructor
在C#
用于初始化对象时argument
传递给initializing
或时returning
{1}}(不分配)或 function
来自C++
的对象,如 {{1 }}
当我们将(不初始化)任何对象分配给同一类型的另一个对象时,是否会调用隐式重载的=
运算符函数?
答案 0 :(得分:1)
在C#中,您不能重载赋值运算符。
在托管内存世界(大多数情况下),析构函数并没有真正意义。实际上有一个等价物(终结者)但你很少需要使用它们。
复制构造函数是针对某些类创建的,但它的完成程度几乎与C ++中的一样。它永远不会被语言隐式调用,只有在您手动调用它时才会使用它。
答案 1 :(得分:1)
为了公平对待C#,由于底层的垃圾收集内存模型,C ++复制控制的复杂性都不是必需的。例如,在复制对象时,您不需要控制动态分配对象的所有权,因为您可以根据需要随意添加对动态对象的引用。
答案 2 :(得分:1)
没有。如果要提供复制机制,可以通过实现ICloneable接口来实现:http://msdn.microsoft.com/en-us/library/system.icloneable.aspx
答案 3 :(得分:1)
C#没有复制构造函数的概念,也没有重载operator=
的概念。在C#对象中只存在,并且在代码中使用句柄。句柄可以“按值”复制以在整个代码中使用,但这是一个所谓的“浅”副本,对象本身仍然相同,它们都指向相同的内存(间接)。
复制构造函数类似于托管世界中的深层复制,您可以通过ICloneable
实现这一点,但它完全是手动的,直到对象的实现来编写它。您也可以通过序列化(boost
方式)或通过任何间接方式实现它。
作为最后一点,由于对象生命周期是非确定性的(当GC任意决定它们应该死亡时它们会死亡),也没有析构函数这样的东西。最接近的是终结器(当您的对象被收集时称为非确定性)和IDisposable
模式(以及using
),它们可以让您对最终化进行控制。毋庸置疑,它们很少被使用。
编辑:我应该指出,虽然复制构造函数没有等价物,但做通过implicit
具有“类型转换”构造函数,此时精确的名称会让我失望。 / p>