美文网首页
类型转换构造函数与析构函数

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

作者: 波洛的汽车电子世界 | 来源:发表于2019-05-04 15:53 被阅读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
    

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

    相关文章

      网友评论

          本文标题:类型转换构造函数与析构函数

          本文链接:https://www.haomeiwen.com/subject/hmoznqtx.html