拷贝构造函数应用场景

来源:互联网 发布:微软推出的人工智能 编辑:程序博客网 时间:2024/05/01 03:39

拷贝构造函数应用场景有四种

#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class Vertify{public:    Vertify()    {               cout << "无参构造函数  " << "构造的对象地址是:" << this << endl;    }    Vertify(int size)    {               cout << "有参构造函数  " << "构造的对象地址是:" << this << endl;        this->size_ = size;    }    Vertify(const Vertify & obj)    {               cout << "拷贝构造函数  " <<"构造的对象地址是:" << this<<endl;        this->size_ = obj.size_;    }    void operator= (Vertify & obj)    {        this->size_ = obj.size_;        cout << "=运算符重载  " << "被赋值的对象地址是:" << this << endl;    }    ~Vertify()    {               cout << "析构函数  " <<"释放的对象地址是:"<<this<< endl;        size_ = 0;    }public:    int size_;};void Test(Vertify ver)//调用形参的拷贝构造函数{    cout << ver.size_ << endl;}Vertify Fun(){       //C++编译器会生成一个匿名对象,匿名对象=v(调用拷贝构造函数),并将其返回出去    Vertify v(10);//调用一次有参构造函数   return v;//调用一次拷贝构造函数,匿名对象=v,调用一次析构函数,释放v的内存}//场景1void Situation1(){    Vertify v1(11);    Vertify v2 = v1;//定义并初始化,调用拷贝构造函数}//场景2void Situation2(){    Vertify v1(22);    Vertify v2(v1);//定义并初始化 ,调用拷贝构造函数   }//场景3void Situation3(){    Vertify v1(33);    Test(v1);}//场景4void Situation4(){    Vertify v(44);//调用一次构造函数    v = Fun();//调用=运算符重载函数  }//调用两次析构函数,先释放的是Fun返回的匿名对象,再释放v的内存空间//对场景4的优化void Situation5(){    Vertify v = Fun();    cout << "这里没有调用拷贝构造函数,而是直接将匿名对象提升为v对象----现代c++编译器进行的优化,提高了性能" << endl;}int main(){    Situation1();       Situation2();    Situation3();    Situation4();    Situation5();    cin.get();    return 0;}

注:观看对象地址了解对象的构造及析构顺序
//场景1打印结果如下
这里写图片描述
//场景2打印结果如下
这里写图片描述
//场景3打印结果如下
这里写图片描述
//场景4打印结果如下
这里写图片描述
//场景5打印结果如下
这里写图片描述

总结:场景4与5区别本质是编译器对匿名对象的处理:
1.=操作时,调用类的=运算符重载函数。
2.初始化操作时,编译器会做优化,不再调用类的拷贝构造函数,大大提高效率。

0 0