类型转换函数
- 目的:实现类型的自动转换
- 只有一个参数,而且不是复制构造函数的构造函数,一般可看做转换构造函数
- 当需要时,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)
- 示例
class A{
public:
double real,imag;
A(int i){ //(1)类型转换构造函数
cout<<"called"<<endl;
real=i;imag=0;
}
A(double r,double i){
real=r;imag=i;}//(2)构造函数
};
int main()
{
A c1(7,8);//调用(2),此时c1={7,8}
A c2=12;//调用(1),此时c2={12,0}
c1=9;//调用(1),9被自动转换成一个临时A对象,此时c1={9,0}
cout<<c1.real<<","<<c1.imag<<endl;
return 0;
}
析构函数
- 名字与类名相同,在前面加
~
,没有参数和返回值,一个类最多只有一个析构函数
- 析构函数在对象消亡时即自动被调用,做一些善后工作,比如释放内存之类
- 如果定义类时没写析构函数,则编译器生成缺省析构函数,缺省析构函数什么也不做
- 如果定义了析构函数,则编译器不生成缺省析构函数
- 对象数组生命期结束时,对象数组的每个元素的析构函数都会被调用
class test{
pulic:
~test(){
cout<<"called"<<endl;}
};
int main(){
test array[2]//两个元素
cout<<"end main"<<endl;
return 0;
}
end main
called
called
- new出来的空间,不delete就不会消亡
- 析构函数和运算符delete
test *ptest;
ptest=new test;//构造函数被调用
delete ptest;//析构函数被调用
----
ptest=new test[3];//构造函数被调用3次
delete []ptest;//析构函数被调用3次
- 若new一个对象数组,用delete释放时应写[],否则只delete一个对象(调用一次析构函数)
-析构函数在对象作为函数返回值返回后被调用
class A{
public:
~A(){
cout<<"destructor"<<endl;}
};
A obj;//3.整个程序结束后,全局变量消亡
A fun(A sobj){//1.参数对象消亡(形参消亡)
return sobj;}
int main(){
obj=fun(obj);//2.函数调用返回值(临时对象)被用过后消亡
return 0;
}
destructor//1
destructor//2
destructor//3