Chinaunix首页 | 论坛 | 博客
  • 博客访问: 496870
  • 博文数量: 111
  • 博客积分: 3160
  • 博客等级: 中校
  • 技术积分: 1982
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:49
个人简介

低调、勤奋。

文章分类

全部博文(111)

文章存档

2014年(2)

2013年(26)

2012年(38)

2011年(18)

2010年(27)

分类: C/C++

2013-01-15 22:27:24

复制构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。

析构函数:是构造函数的互补:当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。析构函数可用于释放对象时构造或在对象的生命期中所获取的资源。不管类是否定义了自己的析构函数,编译器都自动执行类中非 static 数据成员的析构函数。


复制构造函数、赋值操作符和析构函数总称为复制控制。



通常,编译器合成的复制控制函数是非常精练的——它们只做必需的工作。但对某些类而言,依赖于默认定义会导致灾难。实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认版本。有一种特别常见的情况需要类定义自己的复制控制成员的:类具有指针成员


13.1 复制控制

C++ 支持两种初始化形式:直接初始化和复制初始化。复制初始化使用 = 符号,而直接初始化将初始化式放在圆括号中。

形参与返回值:

当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型作返回值时,将返回 return 语句 中的值的副本。

当形参或返回值为类类型时,由复制构造函数进行复制。例如


 string make_plural(size_t, const string&, const string&);

这个函数隐式使用 string 复制构造函数返回给定单词的复数形式。形参是 const 引用,不能复制。


定义自己的复制构造函数:


复制构造函数就是接受单个类类型引用形参(通常用 const 修饰)的构造函数:

     class Foo {
     public:
        Foo();           // default constructor Foo(const Foo&); // copy constructor // ...
     }; 

为了防止复制,类必须显式声明其复制构造函数为 private。 

13.2 赋值操作符

重载操作符:通过定义名为 operator= 的函数,可以对赋值进行定义。

类何时需要定义赋值操作符:

一般而言,如果一个类需要定义复制构造函数,则该类需要定义赋值操作符,具体而言,如果一个类中包含指针型数据成员,或者在进行赋值操作时有一些特定工作要做,则该类通常需要定义复制操作符。


13.3 析构函数

  析构函数是相对构造函数而言的,构造函数获取资源,析构函数释放资源。

  何时调用析构函数:撤销类对象时,会自动调用析构函数。

  何时编写显示析构函数:如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则,这个规则常称为三法则。指的是如果需要析构函数,

  则需要所有这三个复制控制成员。

  合成析构函数:合成析构函数按对象创建时的逆序撤销每个非static成员。

  析构函数没有返回值,没有形参,因此不能重载,析构函数的一个重要特征是,即使我们编写了自己的析构函数,合成析构函数依然会运行。


阅读(730) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~