区分什么时候调用构造函数,复制构造函数和赋值操作符例子

来源:互联网 发布:上海电影频道直播软件 编辑:程序博客网 时间:2024/05/22 11:44

#include<iostream>
#include<vector>
using namespace std;
struct Exmp1{
 //默认构造函数
    Exmp1()
    {
        cout<<"Exmp1()"<<endl;
    }
 //复制构造函数
    Exmp1(const Exmp1&)
    {
        cout<<"Exmp1(const Exmp1&)"<<endl;
    }
 //赋值操作符
    Exmp1&operator=(const Exmp1 &rhe)
    {
        cout<<"operator = (const Exmp1&)"<<endl;
        return *this;
    }
 //析构函数
    ~Exmp1()
    {
        cout<<"~Exmp1()"<<endl;
    }
};
void func1(Exmp1 obj)  //形参为Exmp1对象
{
}
void func2(Exmp1&obj)  //形参为Exmp1对象的引用
{
}
Exmp1 func3()        
{
    Exmp1 obj;
    return obj;        //返回Exmp1对象
}
int main()
{
    Exmp1 eobj;   //调用默认构造函数创建Exmp1对象eobj;
    func1(eobj);  //调用复制构造函数
                  //将形参Exmp1对象创建为实参Exmp1对象的副本 
               //函数执行完毕后调用析构函数撤销形参Exmp1对象
 
 func2(eobj);  //形参为Exmp1对象的引用,无需调用复制构造函数传递实参

    eobj=func3(); //调用默认构造函数创建局部Exmp1对象
                  //函数返回时调用复制构造函数创建作为返回值副本的Exmp1对象
                  //然后调用析构函数撤销局部Exmp1对象              
                  //然后调用赋值操作符
               //执行完赋值操作后,调用析构函数撤销作为返回值副本的Exmp1对象

    Exmp1 *p=new Exmp1;     //调用默认构造函数动态创建Eamp1对象

    vector<Exmp1> evec(3);  //调用默认构造函数,创建一个临时对象值Eamp1对象
                         //然后3次调用复制构造函数,将临时值Eamp1对象复制到vector容器evec的每个元素
                         //然后调用析构函数撤销临时值Eamp1对象

    delete p;     //调用析构函数撤销动态创建的Eamp1对象    

    return 0;     //evec及eobj生命周期结束,自动调用析构函数撤销
               //撤销evec需调用析构函数3次
}

运行结果:

Exmp1()
Exmp1(const Exmp1&)
~Exmp1()
Exmp1()
Exmp1(const Exmp1&)
~Exmp1()
operator = (const Exmp1&)
~Exmp1()
Exmp1()
Exmp1()
Exmp1(const Exmp1&)
Exmp1(const Exmp1&)
Exmp1(const Exmp1&)
~Exmp1()
~Exmp1()
~Exmp1()
~Exmp1()
~Exmp1()
~Exmp1()

原创粉丝点击