其中C++
,我们有Copy Constructor、Destructors、重载=,它们一起被称为复制控制。
我的问题是:
copy constructor
用于在传递给函数时初始化对象 asC#
或whenargument
(不initializing
分配)或当来自returning
a 的对象function
时C++
?当我们将任何对象分配 (而不是初始化)相同类型的另一个对象时,是否
=
会调用隐式重载的运算符函数?
其中C++
,我们有Copy Constructor、Destructors、重载=,它们一起被称为复制控制。
我的问题是:
copy constructor
用于在传递给函数时初始化对象 asC#
或when argument
(不initializing
分配)或当来自returning
a 的对象function
时 C++
?
当我们将任何对象分配 (而不是初始化)相同类型的另一个对象时,是否=
会调用隐式重载的运算符函数?
在 C# 中,您不能重载赋值运算符。
析构函数在托管内存世界中(大多数时候)没有真正意义。实际上有一个等价物(终结器),但您应该很少需要使用它们。
复制构造函数是为某些类创建的,但它不像在 C++ 中那样频繁。它永远不会被语言隐式调用,它只会在你手动调用它时使用。
对 C# 公平地说,由于底层的垃圾收集内存模型,C++ 复制控制的复杂性都不是必需的。例如,复制对象时不需要控制动态分配对象的所有权,因为您可以随意拥有对动态对象的任意数量的引用。
不,如果你想提供复制机制,你可以通过实现 ICloneable 接口来做到这一点:http: //msdn.microsoft.com/en-us/library/system.icloneable.aspx
C# 没有复制构造函数的概念,也没有重载的概念operator=
。在 C# 中,对象只是存在,您在代码中使用它们的句柄。句柄可以“按值”复制以在整个代码中使用,但这是所谓的“浅”复制,对象本身仍然相同,它们都指向相同的内存(间接地)。
复制构造函数类似于托管世界中的深度复制,您可以通过ICloneable
. 您也可以通过序列化(boost
方式)或通过任何方式的间接方式来实现它。
最后一点,由于对象的生命周期是不确定的(当 GC 任意决定它们应该死亡时它们就会死亡),所以也不存在析构函数之类的东西。最接近的是终结器(当您的对象被收集时被称为非确定性的)和IDisposable
模式(与 一起using
),它使您可以控制终结器。不用说它们很少使用。
编辑:我应该指出,虽然复制构造函数没有等价物,但您确实有“类型转换”构造函数implicit
,确切的名称目前让我无法理解。