自己总结了一下C++和Java中的深拷贝和浅拷贝。
C++的类中如果不定义等号的重载函数,则在调用过程中编译器默认等号起浅拷贝的作用 ,如下列代码:
#include
<
iostream
>
#include < string >
using namespace std;
class Obj
... {
public:
string str;
public:
Obj(string s="init value")
...{
str=s;
}
} ;
void main()
... {
Obj objA("init value");
Obj objB = objA;
objA.str = "changed in objA";
cout<<"Print objB.str value: "<<objB.str<<endl;
}
#include < string >
using namespace std;
class Obj
... {
public:
string str;
public:
Obj(string s="init value")
...{
str=s;
}
} ;
void main()
... {
Obj objA("init value");
Obj objB = objA;
objA.str = "changed in objA";
cout<<"Print objB.str value: "<<objB.str<<endl;
}
输出:Print objB.str value: init value
如要进行深拷贝,则要写一个拷贝构造函数Obj(Obj &another){……},拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用。
而Java中自定义类(非Java基本数据类型和String)示例的等号则默认为引用传递,如ClassA=ClassB实质上就是将类B的地址赋给类A,赋值完成后A和B指向同一个对象,对其中任何一个修改均有效,如:
class
PassObj
... {
String str = "init value";
}
public class ObjPassValue
... {
public static void main(String[] args)
...{
PassObj objA = new PassObj();
PassObj objB = objA;
objA.str = "changed in objA";
System.out.println("Print objB.str value: " + objB.str);
}
}
... {
String str = "init value";
}
public class ObjPassValue
... {
public static void main(String[] args)
...{
PassObj objA = new PassObj();
PassObj objB = objA;
objA.str = "changed in objA";
System.out.println("Print objB.str value: " + objB.str);
}
}
输出:Print objB.str value: changed in objA