|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kangels 于 2013-3-19 10:22 编辑
3 B) a8 G* K }- D2 L; _7 ^$ d
9 ~7 m. i: h* ]- w. X+ \# }' AC++自动提供的成员函数2 z: M' g- @3 e' V( Q
8 y$ c, C6 T+ M+ a8 J
- 默认的构造函数,如果没有定义
- 默认的析构函数,如果没有定义
- 复制构造函数,如果没有定义
- 赋值操作符,如果没有定义
- 取址操作符,如果没有定义
, A7 F4 f; t0 r 1. 默认的构造函数8 }; S7 B" C8 S( V
如果没有默认的构造函数,C++将创建默认的构造函数,例如定义了一个base类,没有定义任何构造函数,则编译器将提供下述默认构造函数:6 }0 ]( P4 h, y; V) Y' Z
base::base(){}
. {* q& M7 S, `也就是一个什么都不做的默认构造函数0 P3 [4 a. F+ `) e
$ d. I0 Z& q, H& c* b" E2. 默认的析构函数
( a; v- k0 K" u1 x" d3. 复制构造函数
4 x2 t$ d8 }) z# Q; H8 A' X复制构造函数用于初始化,将一个对象复制到新创建的对象中,而不是常规的赋值过程中。
! A5 G: i- ]( YClass_name(const Class_name &)
. d$ j/ {! {! ~" N<1> 何时调用复制构造函数
0 L) W5 K' l: K) j [! Z* C3 ^: t新建 一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。4 {; R3 `6 U, L x- w* I
假设dog为animal类的一个对象,下面几种情况都将调用复制构造函数
" d/ S1 `* I, z3 Banimal cat = dog;, r3 Q# N' v6 f' A3 n
animal pig(dog);; z- M; e2 e4 C1 _! B
animal fish = animal(dog);: R$ {) e' R' y
animal * pa = new animal(dog);
) y; P3 Q9 B* d B7 u# v每当程序生成对象副本时,编译器都将调用复制构造函数。
7 J+ j1 S* h3 o$ e$ |: tvoid I_love_eat(animal an); // 调用此函数时将生成实参的对象副本,将调用复制构造函数
) y3 W" }# k0 Xanimal Big_bad_animal(); // 此函数返回animal对象时将生成animal对象副本,也将调用复制构造函数
3 I$ l3 k" v/ ` @7 g, l: ?/ V, D<2> 复制构造函数的功能。
6 M4 J: c6 ^6 T8 c) `7 F! e默认的复制构造函数逐个复制非静态成员
$ Y* d0 c/ Y( Q! N9 h6 Y4 A, w% r. Q
4. 赋值操作符
+ _( @$ s1 u- K7 G9 _7 r' MANSI C允许结构赋值,而C++允许类对象赋值,这是通过自动为类重载赋值操作符实现的。
% n- r! _# n/ ^! [% eClass_name & operator =(const Class_name &);$ @, B" l5 j+ [# a
<1> 何时使用赋值操作符
$ g6 x) @3 T' A将已有对象赋值给另一个同类对象时,将使用重载的赋值操作符。+ e! m# m/ ~" F; T% F+ o# [
<2> 赋值操作符的功能4 j2 ^2 p1 o+ l8 z
与复制构造函数相似,赋值操作符的隐式实现也对成员进行逐个复制。
* q. Y% `+ z1 T1 t. J& s: L
* I* P" @* J: B* g/ b5 .取址操作符
8 u" v- D; c |# L% X" J/ ?, g |
评分
-
查看全部评分
|