今天,一个学生问了我一个深拷贝的问题,突然间我发现这块知识我忘得光光的。就连拷贝构造函数和默认拷贝构造函数的关系也突然觉得模糊起来。下班以后就翻书查看了一下C++的书,觉得这个知识点还是很有必要在这里写出来与大家共勉。
这道题非常典型。
class A { public: A() { pchar = new char[100]; }
~A() { delete pchar; }
char * pchar; }; void Fun(A s) {
} void main() { A s; Fun(s); getchar(); }
运行这段代码会报错,原因是函数Fun的形参存在一个拷贝类A的内存操作,而拷贝一个类 不同于拷贝一个int变量。
如果我们要拷贝一个
int i=5;
int j = i;
这样就完成了,但是对于一个类A的的对象之间的拷贝,就不是这么简单了。
类对象内部存在着成员变量,拷贝就不能按照普通成员的方式来拷贝,而是要通过拷贝构造函数来完成复制过程。但是在平常的代码书写的时候,我们并没有去执行拷贝构造函数,甚至从来在自己的类中从来没有写过拷贝构造函数,原因是系统会自动提供一个默认的拷贝构造函数。
下来我们改写上面的代码,通过拷贝构造函数我们就避免了上面方法的不足。
class A { public: A() { pchar = new char[100]; } A(A &temP) { pchar = new char[100]; }
~A() { delete pchar; }
char * pchar; }; void Fun(A s1) {
} void main() { A s; Fun(s); getchar(); }
上面代码中的A(A &temP)就是我们自定义的拷贝构造函数,拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用。 当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候系统将会提供给一个默认的拷贝构造函数来完成这个过程。
[此贴子已经被作者于2009-3-6 14:12:09编辑过] |