Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20852
  • 博文数量: 14
  • 博客积分: 325
  • 博客等级: 一等列兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-13 10:46
文章分类

全部博文(14)

文章存档

2012年(14)

我的朋友
最近访客

分类: C/C++

2012-07-28 21:14:29

拷贝构造方法的定义:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).

 

即拷贝构造方法必须符合以下两个特征:

1)是一个构造方法,且第一个参数是 Class&,const Class&,volatile Class& 或者 const volatile Class& 类型的形参,其后没有其它形参或者是全有默认实参的形参。

2)不是模版方法。

 

 

默认赋值操作的定义:

A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const  X&, volatile  X& or const  volatile X&.

 

即默认赋值操作必须符合以下三个特征:

1)只能有一个形参,且其类型是 Class,Class&,const Class&,volatile Class& 或者 const volatile Class& 类型的形参。

2)不是模版方法。

3)不是静态方法。

 

如果一个类没有定义拷贝构造方法或者默认赋值操作,则编译器会为它自动生成一个拷贝构造函数和一个默认赋值操作的缺省实现:

1)拷贝构造方法的缺省实现是 对所有成员变量依次调用默认复制构造方法。

2)默认赋值操作的缺省实现是 对所有成员变量依次调用默认赋值操作。

 

一般来说,若需要自定义拷贝构造方法,则一定要重载默认赋值操作,反之亦然。因stl库中使用了如同 T a = T(); 类似语句,所以拷贝构造方法不应指定explicit关键字

 

示例代码:

  1. class TestClass {
  2. public:
  3.     /*explicit*/ TestClass(); // 无参/默认构造方法
  4.     TestClass(const TestClass &obj); // 拷贝构造方法
  5.     /*explicit*/ TestClass(int i); // 普通构造方法
  6.     virtual ~TestClass();

  7.     TestClass & operator=(const TestClass &obj); // 默认赋值操作
  8.     TestClass & operator=(int i); // 普通赋值操作
  9. };

  10. /* 测试代码 */
  11. TestClass a;     // 调用无参/默认构造方法
  12. TestClass b = a; // 调用拷贝构造方法
  13. b = a;           // 调用默认赋值操作
  14. TestClass c = 1; // 调用普通构造方法
  15. c = 1;           // 先匹配普通赋值操作,再匹配普通构造方法

 

当  1)将对象作为实参传给形参时  2)某个方法return结果时  都会调用该类的拷贝构造方法。


 

阅读(378) | 评论(0) | 转发(0) |
0

上一篇:C++精简笔记

下一篇:方法和函数

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