类型转换构造函数基本概念:
-
定义转换构造函数的目的是实现类型的自动转换。
-
只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是转换构造函数。
Complex( int i) {//是类型转换构造函数 cout << "IntConstructor called" << endl; real = i; imag = 0; } Complex(double r,double i) {//不是类型转换构造函数 real = r; imag = i; } int main () { Complex c1(7,8); Complex c2 = 12; c1 = 9; // 9被自动转换成一个临时Complex对象 cout << c1.real << "," << c1.imag << endl; //9,0 return 0; }
-
当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)。
析构函数基础概念:
- 名字与类名相同,在前面加‘~’, 没有参数和返回值,一个类最多只能有一个析构函数。
- 析构函数对象消亡时即自动被调用。可以定义析构函数来在对象消亡前做善后工作,比如释放分配的空间等。
- 如果定义类时没写析构函数,则编译器生成缺省析构函数。缺省析构函数什么也不做。
- 如果定义了析构函数,则编译器不生成缺省析构函数。
析构函数实例
class String{
private : char * p;
public: String () {
p = new char[10];
}
~ String () ;
};
String ::~ String() {
delete [] p;
}
注意点:
若new一个对象数组,那么用delete释放时应该写 []。否则只delete一个对象(调用一次析构函数)
静态局部对象在整个mian函数结束后才会消亡
析构函数不负责回收对象所在的存储空间
pTest = new Ctest[3]; //构造函数调用3次
delete [] pTest; //析构函数调用3次
实例:构造函数和析构函数什么时候被调用