博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 拷贝构造和赋值构造示例
阅读量:4128 次
发布时间:2019-05-25

本文共 3039 字,大约阅读时间需要 10 分钟。

一开始,对这些拷贝构造,赋值构造也是很迷,然后就把这些常见的总结到一起,进行对比。希望对各位有些帮助。

#include 
using namespace std;class A{ public: A() { cout << "A default constructor" << endl; } A(const A &obj) { cout << "A copy constructor" << endl; } ~A() { cout << "A destroy" << endl; } A &operator=(const A &s) { if (this == &s) return *this; cout << "operator left = " << endl; return *this; } A &operator=(A &&s) { cout << "operator right = " << endl; return *this; }};class B{ public: B() { cout << "B construcor" << endl; } A btemp; A get() { return btemp; }};A fun(){ A temp; return temp;}int main(){ cout << "--------------part 1 ------------" << endl; A a1; a1 = fun(); // 1.对temp对象进行拷贝一个t1拷贝完成后 2.析构temp,然后调用a1的 "=" 运算符,t1作为参数传入 // gcc中是不这样干的,不拷贝生成一个t1,直接调用a1的 "=" 运算符,用temp做参数 cout << "--------------part 2 ------------" << endl; A a2 = fun(); //微软的编译器:1.直接用fun()里面的temp,调用拷贝构造函数创建a2 2.a2生成后才析构fun()里面的temp //gcc中不是这样干的,直接把fun()里面的temp作用域提升,扶正成为a2,两个内存地址是一样的 cout << "--------------part 3 ------------" << endl; cout << "--" << endl; B b; cout << "--" << endl; A a3 = b.get(); // 1.直接用b.get()里面的btemp对象,进行copy构造一个a3,和上面a2一样。 cout << "--------------part 4 ------------" << endl; A a4; a4 = b.get(); // 1.通过b.get()里面的btemp对象,copy构造一个对象t,3.构造然后调用 "=" 运算符 3.调用完再析构这个t cout << "--------------part 5 ------------" << endl; a3 = a4; // 直接调用a3的 = 运算符 cout << "--------------part 6 ------------" << endl; A a5; a5 = A(); // 1.创建匿名对象 2.调用 "=" 运算符 3.再析构匿名对象 cout << "--------------part 7 ------------" << endl; A a6 = A(); // 等价 A a6();}

gcc 和微软家的编译器有些不同,上面代码注释有说明。

gcc环境下输出:

--------------part 1 ------------A default constructorA default constructoroperator right = A destroy--------------part 2 ------------A default constructor--------------part 3 --------------A default constructorB construcor--A copy constructor--------------part 4 ------------A default constructorA copy constructoroperator right = A destroy--------------part 5 ------------operator left = --------------part 6 ------------A default constructorA default constructoroperator right = A destroy--------------part 7 ------------A default constructorA destroyA destroyA destroyA destroyA destroyA destroyA destroy

visual studio 输出:

--------------part 1 ------------A default constructorA default constructorA copy constructorA destroyoperator right =A destroy--------------part 2 ------------A default constructorA copy constructorA destroy--------------part 3 --------------A default constructorB construcor--A copy constructor--------------part 4 ------------A default constructorA copy constructoroperator right =A destroy--------------part 5 ------------operator left =--------------part 6 ------------A default constructorA default constructoroperator right =A destroy--------------part 7 ------------A default constructorA destroyA destroyA destroyA destroyA destroyA destroyA destroy

对比,左边是gcc右边是vs:

在这里插入图片描述

转载地址:http://hdzvi.baihongyu.com/

你可能感兴趣的文章
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>