关于浅拷贝嵌套我不太理解。class A
{
 int x;
}class B
{
 int y;
 A a;
}
1:static void Main()
{
 B obj1 = new B();
 B obj2 = obj1;
}内存分配是不是下面这个样?
stack         GC heap 
obj1 ------>  y
obj2          a ----> x  2:对于浅拷贝,只复制引用不复制实际的对象。B obj1 = new B();
obj2 = obj1.clone();  //假设clone方法实现浅拷贝那么这个地方,obj2的内存分配是什么样的?是和上面一样的直接指向原来的实例,还是会创建一个新的实例 ,复制各个字段(引用字段只复制引用),如下图stack         GC heap 
obj1 ------>  y
              a ----> x  
                      ^
obj2 ------>  y       |
              a ------| 
对于这种类型中还有引用类型的,浅拷贝是如何拷贝的?3:对于memberwiseclone方法,我看了好多地方,他是浅拷贝。但又会创建新的实例,然后复制原对象的各个字段。B obj1 = new B();
obj2 = obj1.clone();  //假设clone方法为调用memberwiseclone方法这个内存分配又是怎么样的?

解决方案 »

  1.   

    C++里的拷贝构造函数知道吗?这个memberwiseclone和C++的默认拷贝构造函数一样的作用,直接复制内存,不管对象里面的是值还是引用(指针)
      

  2.   

    浅表副本创建与原始对象具有相同类型的新实例,然后复制原始对象的非静态字段。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制该引用但不复制被引用的对象;这样,原始对象中的引用和复本中的引用指向同一个对象。相反,对象的深层副本复制对象中字段直接或间接引用的全部内容。这是MSDN的定义。我想问,浅拷贝时是否会创建一个新的实例?用B obj2 = obj1实现的是否就不创建一个新的实例??