Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106453
  • 博文数量: 40
  • 博客积分: 1650
  • 博客等级: 上尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-20 13:05
文章分类
文章存档

2011年(1)

2009年(1)

2008年(1)

2007年(37)

我的朋友

分类: C/C++

2007-07-25 16:52:55

拷贝构造函数一种特殊的构造函数,只有当构造函数的参数为自身类的引用时,这个构造函数才是拷贝构造函数。

当用一个已有对象构造一个新的对象时,系统自动调用拷贝构造函数来创建新的对象,并把对象的数据成员值拷贝给新的对象。

拷贝构造函数定义的一般形式:

类名::类名(类名 &形参对象名){...}
例:
#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;
}

浅拷贝和深拷贝
在没有拷贝构造函数的时候,编译器进行的实际上是一种深拷贝,但我们需要的并不是这种拷贝。我们需要在对象拷贝的时候能够干涉它,象上例所示,能够为新的对象分配新的存储区域。
 如果我们定义了拷贝构造函数,当创建新对象的时候,编译器将不再使用深拷贝。
它调用的是我们定义的拷贝构造函数。
阅读(673) | 评论(0) | 转发(0) |
0

上一篇:perl中模式匹配

下一篇: C库函数手册

给主人留下些什么吧!~~