拷贝构造函数一种特殊的构造函数,只有当构造函数的参数为自身类的引用时,这个构造函数才是拷贝构造函数。
当用一个已有对象构造一个新的对象时,系统自动调用拷贝构造函数来创建新的对象,并把对象的数据成员值拷贝给新的对象。
拷贝构造函数定义的一般形式:
类名::类名(类名 &形参对象名){...}
例:
#include
using namespace std;
class Base
{
public:
Base (char *pname)
{
strncpy (name, pname, 40);
name[30] = '\0';
cout << "Base: " << name << endl;
}
Base (Base & p) //拷贝构造函数
{
strcpy (name, "CBase ");
strcat (name, p.name); //字符串连接函数
cout << "CBase: " << name << endl;
}
~Base () //析构函数
{
cout << "Destructing " << name << endl;
}
protected:
char name[40];
};
int
main ()
{
Base object ("object");
Base object1 (object);
return 0;
}
一般情况下,不必定义拷贝构造函数,系统自动为类提供一个缺省的拷贝构造函数。但是,如果构造函数中存在动态分配,则必须定义拷贝构造函数。
例:
#include
using namespace std;
class Base
{
public:
Base (char *pname)
{
name = (char *) malloc (40);
strncpy (name, pname, 40);
name[39] = '\0';
cout << "Base: " << name << endl;
}
Base (Base & p) //拷贝构造函数
{
name = (char *) malloc (46);
strcpy (name, "CBase ");
strcat (name, p.name); //字符串连接函数
cout << "CBase: " << name << endl;
}
~Base () //析构函数
{
cout << "Destructing: " << name << endl;
free (name);
}
protected:
char *name;
};
int
main ()
{
Base object ("object");
Base object1 (object);
return 0;
}
浅拷贝和深拷贝
在没有拷贝构造函数的时候,编译器进行的实际上是一种深拷贝,但我们需要的并不是这种拷贝。我们需要在对象拷贝的时候能够干涉它,象上例所示,能够为新的对象分配新的存储区域。
如果我们定义了拷贝构造函数,当创建新对象的时候,编译器将不再使用深拷贝。
它调用的是我们定义的拷贝构造函数。
阅读(711) | 评论(0) | 转发(0) |