c++构造函数与析构函数
Constructor (构造函数)与destructor (析构函数):类别中特殊的成员函数,编译器会对它们作特殊的处理.请参考 complex.cc , vector.cc ,与 creature.cc .
功用: 希望(半自动或全自动地) 对每个变量做起始与清除的动作, 通常对应到C 程序中名称为init/open/begin/start/... 与shutdown/close/end/stop/ ... 等函数. 类似观念: 窗口程序设计??中的open 与close 等event (事件) 的script (脚本)
执行情况
constructor: 变量生命开始时(即自系统取得记忆空间时). 无参数的constructor 自动执行; 有参数的constructor 手动执行.
destructor: 变量生命结束前(将记忆空间还给系统前). 一律没有参数, 系统会在适当时候自动传递.
以变??数的life time 分别说明:
静态变量: 进出整个程序时.
自动变量: 进出block 时.
free store 上的变量: new 与delete 时.
声明方式
Constructor 名称与类别名称相同, 不可以有传回值(连void 都不写), 不应声明为const. 可以有好几个signature 不同的constructors.
Destructor 名称与类别名称相同, 但前面多了~. 一个类别只能有一个destructor, 且不可以有传回值(连void 都不写), 不应声明为const, 也不可以有参数.
声明可接受单一参数的constructor (包含有多余的内定参数者) 时, 记得在constructor 名称前面加上explicit 这个keyword; 稍后再解释何时不必加. (定义处不要写explicit)
如何传递constructor
声明变量时,例: complex x(3,-4), y(2,-1); 注意: local static变量的constructor在该副程序第一次执行时起动.
以new产生变量时,例: p = new complex(4,-3);
在"上级"类别的constructor中, "前面"处,传递"下级"类别的constructor,例: explicit comlpex(double r, double i=0) : re(r), im(i) { } (称为constructor initializer )以这个例子而言,其实效果和
- explicit complex(double r, double i=0)
- {
- re = r; im = i;
- }
一样. 但是constructor initializer 的写法比较具有一般性, 在很多情况下非用它不可, 例如
data member 又是一个用户自定的类别;
data member 是一个reference
data member 是一个const
在initialize base class member 时(见继承单元)
产生用毕即弃的临时变量,例: complex(3,4).print();或return complex(re + b.re, im + b.im);或return complex(abs * cos(angle), abs * sin(angle));
注意: 即使声明变量或使用new时不传参数,仍旧有一个constructor会自动执行 --也就是那个不需要参数的constructor.
如何传递destructor: No, never do that!
Copy constructor (复制构造函数)
声明方式: complex(complex const & x)
执行情况:
给新声明的变量设置起始值,以旧的变量为范本,例: complex x(3,4); complex y(x);
以值传递参数.
参数传回值.
注意:在变量声明中, complex y = x;会传递到copy constructor;但是在程序中, y = x; 传递到的则是assignment operator.
以下四个特殊成员函数与memory allocation 有关, 且同一个类别中, 修改这四个成员函数的程序码时, 往往必须一起考虑.
Constructor: new
Destructor: delete
Copy constructor: new, copy
Assignment operator: (delete, new,) copy (记得检查src 与dst 相同的特殊状况.)
结论: 要多少空间来, 就还多少空间回去, 最后一定要收支平衡.
内建版的特殊成员函数
上述四个特殊的member functions 都有内建版. 内建的constructor (没有参数) 与destructor 什么都不作; 内建的copy constructor 做的是: "逐一传递每个数据成员的copy constructor"; 内建的assignment operator 做的是: "逐一传递每个数据成员的assignment operator". 在最底层(也就是int, double, char, ... 等内建型别) 的copy constructor 与assignment operator 都是直接拷贝整个变量.
如果程序设计师声明了任何一个constructor (不论是有参数的版本或没有参数的版本), 则内建的(没有参数的) constructor 自动消失.
如果程序中需要声明某一类别的数组变量, 则该类别一定要有一个不具参数的constructor (内建的或程序设计师定义的皆可)
在一个composite class中(即类别的data member本身又是一个用户自定的类别),层层叠叠的constructors的传递顺序是由下而上;而destructors的传递顺序则是由上而下. (想像盖房子与拆房子的顺序)
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
