c++学习记录(六)

类型转换函数

  • 目的:实现类型的自动转换
  • 只有一个参数,而且不是复制构造函数的构造函数,一般可看做转换构造函数
  • 当需要时,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)

- 示例

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

  • 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

posted on 2020-02-02 13:13  2002ljy  阅读(156)  评论(0编辑  收藏  举报

导航

Live2D