类型转换构造函数与析构函数

2019-05-04  本文已影响0人  波洛的汽车电子世界

注:以下大部分内容来源于 coursera 课程《C++程序设计》

类型转换构造函数

  1. 目的:实现类型的自动转换。
  2. 特点:只有一个参数;不是复制构造函数;被调用时会建立临时的变量
class Complex{
public:double real,imag;
Complex(int i){ //类型转换构造函数(2)
cout<<"IntConstructor called"<<endl;
real = i;
imag = 0;
}
Complex(double r, double i){ //构造函数(1)
real = r; 
imag = i;}
};
int main(){
Complex c1(7,8); //调用构造函数(1)
Complex c2=12; //调用类型转换构造函数(2)
c1 = 9;//9被自动转换成一个临时Complex对象
cout<<c1.real<<","<<c1.imag<<endl;
return 0;
}

Complex c2=12; 这个语句对c2进行初始化,在初始化的过程中,调用类型转换构造函数,它是不会去生成一个临时的变量的,而只是把12那个参数传入(2)。
c1 = 9是一个赋值语句,这里注意,赋值后的两边其实是不同类型的。c1 是complex 型,9是整型。在生成这个赋值语句的时候,编译器会调用类型转换构造函数,首先会生成一个临时变量,9被自动转换成一个临时Complex对象,然后将这个complex对象赋值给c1。

析构函数 Destructor

  1. 格式:在类前面加"~"
  2. 作用:在象消亡前做善后处理,例如释放分配的空间等。
    3.对象消亡时,自动被调用。如果没有写,编译器会自动生成缺省析构函数。
class String{
private: char *p;
public: 
String(){
p = new char[10];
}
~String(); 
};
String::~String(){
delete [] p ;
}
  1. 数组:对象数组将生命期结束时,对象数组的每个元素的析构函数都会被调用。
class Ctest{
public:
~Ctest(){cout<<"destructor called"<<endl;}
};
int main(){
Ctest array[2];
cout<<"End Main"<<endl;
return 0;
}
输出:
End Main
destructor called
destructor called

定义了一个Ctest类下面的一个对象数组array, 它包含了两个对象。
结束的时候, 我们就要释放相应的对象,会调用两次析构函数。

  1. delete 运算符
    delete 运算导致析构函数调用
Ctest *pTest;
pTest = new Ctest; //构造函数调用
delete pTest;//析构函数调用
pTest = new Ctest[3]; //构造函数调用
delete []pTest;//析构函数调用

定义了一个 Ctest的的一个指针, pTest,那么它指向谁呢?它指向了new出来的一个Ctest,

  1. 比较
构造函数 析构函数
成员函数的一种 成员函数的一种
名字与类型相同 名字与类型相同
可以有参数,不能有返回值 没有参数值和返回值
可以有多个构造函数 一个类最多一个析构函数
可以用来初始化,初始化不同对象需要多个 对对象消亡前做最后的善后处理,一个就足够
  1. 例子
class Demo{
int id;
public:
Demo(int i){
id = i;
cout<<"id = "<< id<<"Constructed"<<endl;
}
~Demo(){
cout<<"id = "<< id<<"Destructed"<<endl;
}};
Demo d1(1); //定义了一个全局变量
void Func(){
static Demo d2(2); //静态变量的消亡在程序结束之时
Demo d3(3);
cout<<"Func"<<endl;
}
int main(){
Demo d4(4);
d4 =6;  //类型转换构造函数
//生成一个临时变量,并且析构
cout<<"main"<<endl;
{Demo d5(5);} //作用域,离开作用域就会消亡
Func();//包含两个变量,d2是静态的,会在整个程序结束时消亡,d3直接消亡
cout<<"main ends"<<endl;
return 0;
}
输出:
id = 1 Constructed
id = 4 Constructed
id = 6 Constructed
id = 6 Destructed
main
id = 5 Constructed
id = 5 Destructed
id = 2 Constructed
id = 3 Constructed
Func
id = 3 Destructed
main ends
id = 6 Destructed
id = 2 Destructed
id = 1 Destructed

最先构造的会最后被消亡掉。

上一篇下一篇

猜你喜欢

热点阅读