|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kangels 于 2013-3-19 10:22 编辑
: \% ~: `4 ~8 J- _
2 [4 v$ s# [5 m. j& AC++自动提供的成员函数5 s9 d; p+ @& G% m5 u q
% {% @% _( o3 {. Q( m/ J
- 默认的构造函数,如果没有定义
- 默认的析构函数,如果没有定义
- 复制构造函数,如果没有定义
- 赋值操作符,如果没有定义
- 取址操作符,如果没有定义
" Z q1 u: y" P0 A% j( ~5 w: Q4 L 1. 默认的构造函数* U" }) B/ J# E- L, q. }
如果没有默认的构造函数,C++将创建默认的构造函数,例如定义了一个base类,没有定义任何构造函数,则编译器将提供下述默认构造函数:5 q$ N5 m5 j% I
base::base(){}: T! D, o: Q) n" E9 C
也就是一个什么都不做的默认构造函数3 E, g# L- ~' T
& B% [$ M0 h$ `! B
2. 默认的析构函数
! [6 z7 o5 M" D4 E3. 复制构造函数 T2 l, C7 v' c
复制构造函数用于初始化,将一个对象复制到新创建的对象中,而不是常规的赋值过程中。
0 [, H* _. B$ U$ ]3 X9 M0 x- VClass_name(const Class_name &)
0 Q! E/ L8 R3 D" ]. U0 }( j3 |8 z<1> 何时调用复制构造函数
& G8 E4 `, }+ x8 Y2 `$ U新建 一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。
+ u7 X) \/ i2 A假设dog为animal类的一个对象,下面几种情况都将调用复制构造函数; ~, C, z5 O* A7 b
animal cat = dog;
a2 u6 z& I( A8 F* Y% g1 ^animal pig(dog);' G& a' e% s9 ~
animal fish = animal(dog);
" t3 s, g7 w, B2 V7 m {animal * pa = new animal(dog);
' X9 {$ A, t8 t9 w9 T+ [- O/ Q$ K每当程序生成对象副本时,编译器都将调用复制构造函数。% ~" N4 f7 K# u Q: @1 Q
void I_love_eat(animal an); // 调用此函数时将生成实参的对象副本,将调用复制构造函数
* s4 |& Z; s: Janimal Big_bad_animal(); // 此函数返回animal对象时将生成animal对象副本,也将调用复制构造函数
. X6 W; V+ b( \<2> 复制构造函数的功能。
. Q% k" ], m5 M' k2 S8 U默认的复制构造函数逐个复制非静态成员" {+ O4 D4 w+ H- d% h
|3 ^' L* W V, @/ V4. 赋值操作符. e$ p7 E( [5 C, s% V
ANSI C允许结构赋值,而C++允许类对象赋值,这是通过自动为类重载赋值操作符实现的。& t+ K9 q' p, l4 w
Class_name & operator =(const Class_name &);+ B. e& |; c$ k' ?* f
<1> 何时使用赋值操作符
& j ]9 m7 X* I1 z0 b' t+ b将已有对象赋值给另一个同类对象时,将使用重载的赋值操作符。
4 w8 y. ? C8 B8 u- [<2> 赋值操作符的功能( N3 M$ z8 A W( A0 k0 s
与复制构造函数相似,赋值操作符的隐式实现也对成员进行逐个复制。6 N* u! p$ W: h0 n9 ?+ c& M& G/ I
/ `" n5 X/ V$ {
5 .取址操作符/ o$ b, h4 I" o2 c% |" X% v
|
评分
-
查看全部评分
|