2016-02-27 84 views
4

其实我不明白它的概念,这意味着为什么以及何时应该使用它。通常情况下,我们可以将值分配到一个类的实例,但是,为什么我们要发送对象,以这样的另一个对象:什么是复制构造函数,什么时候应该在C#中使用?

private void button8_Click(object sender, EventArgs e) 
    { 
     rectangle r1 = new rectangle(50, 70); 
     rectangle r2 = new rectangle(r1); 
    } 



class rectangle 
{ 
    private int length; 
    private int breadth; 


    public rectangle(rectangle x) 
    { 
     length = x.length; 
     breadth = x.breadth; 
     MessageBox.Show("I'm a Copy Constructor. \n Length= " + length.ToString() + "\n breadth= " + breadth.ToString()); 

    } 
} 
+0

这是一个复制矩形的简单方法。从外面看,这是不可能的,因为你的财产是私人的。你也可以修改你的矩形或类似的东西。 – Fruchtzwerg

+0

那么,我可能已经看到它在某些库中使用,但这在C#中并不常见。复制构造函数是C++编程的明显基石,但在C#中,它们只不过是组织[深层克隆]的奇特(但是正确的)方式(http://stackoverflow.com/questions/129389/how-do-you-做一个深度复制的对象在网络c具体)(至少是我期望从它)。 –

回答

1

这是一个可行的方法,从完全或部分初始化的对象拷贝的成员值源对象。

对于您的情况,您可以将此称为映射对象

另外,rectangle类可以实现像CreateFrom一个静态方法,将工作作为当前的构造函数,它也将工作就像一个工厂方法:

class rectangle 
{ 
    private int length; 
    private int breadth; 

    public static rectangle CreateFrom(rectangle x) 
    { 
     rectangle r = new rectangle(); 
     r.length = x.length; 
     r.breadth = x.breadth; 

     return r; 
    } 
} 

...也许这样你会发现你的活动处理程序代码更有趣:

private void button8_Click(object sender, EventArgs e) 
{ 
    rectangle r1 = new rectangle(50, 70); 
    rectangle r2 = rectangle.CreateFrom(r1); 
} 
+1

不应该CreateFrom有一个返回r? – 2016-02-27 21:03:22

+0

@Svetlana Yup,谢谢;) –

1

拷贝构造函数是从C++借用一个概念:此构造函数的唯一目的是从现有对象进行复制。另外,如果程序员不提供一个,编译器自动定义拷贝构造函数C++(隐式拷贝构造函数)。您可以混合使用:对于具有特殊复制行为的类,您提供了复制构造函数。对于其他类,如果类具有此类成员,则隐式拷贝构造函数将调用您的自定义构造函数。

摘要:复制构造函数C++是复制对象及其成员的简单方法。诀窍是你不必明确提供一个,并且它在编译器级别上得到支持。

据我所知,C#中没有隐式拷贝构造函数。而不是这个特殊的构造函数,你可以在C#中使用克隆。例如,请参阅this question

另一个注意事项:structs是在assigment上复制的,但不是递归的。即使有no implicit copy constructor,它只有一个简单的内存拷贝。

对于C++拷贝构造函数,例如参见section 12.8, page 288 in the C++14 standard

相关问题