C++ 拷贝构造和赋值构造示例

【C++基础知识】拷贝构造函数和拷贝赋值运算符 拷贝构造函数VS拷贝赋值运算符 阅读详情

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

#include <iostream>
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 constructor
A default constructor
operator right = 
A destroy
--------------part 2 ------------
A default constructor
--------------part 3 ------------
--
A default constructor
B construcor
--
A copy constructor
--------------part 4 ------------
A default constructor
A copy constructor
operator right = 
A destroy
--------------part 5 ------------
operator left = 
--------------part 6 ------------
A default constructor
A default constructor
operator right = 
A destroy
--------------part 7 ------------
A default constructor
A destroy
A destroy
A destroy
A destroy
A destroy
A destroy
A destroy

visual studio 输出:

--------------part 1 ------------
A default constructor
A default constructor
A copy constructor
A destroy
operator right =
A destroy
--------------part 2 ------------
A default constructor
A copy constructor
A destroy
--------------part 3 ------------
--
A default constructor
B construcor
--
A copy constructor
--------------part 4 ------------
A default constructor
A copy constructor
operator right =
A destroy
--------------part 5 ------------
operator left =
--------------part 6 ------------
A default constructor
A default constructor
operator right =
A destroy
--------------part 7 ------------
A default constructor
A destroy
A destroy
A destroy
A destroy
A destroy
A destroy
A destroy

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

在这里插入图片描述

C++ String类 - 构造函数/拷贝构造/赋值构造/移动拷贝/移动赋值/析构Demo 直接上代码,自己运行体会(仅供原理理解参考,实际工程中使用需进一步加强健壮性): #include <thread> #include <chrono> #include <iostream> #include <string> #include <string.h> using namespace std; class MyString { public: MyString():data(nullptr),id(std::chron.. 阅读详情

相关推荐

Android手机免root玩转Kali NetHunter:Termux保姆级安装指南(附Kex VNC配置)

本文提供了一份详细的Android手机免root安装Kali NetHunter的保姆级指南。通过使用Termux终端模拟器,用户无需解锁Bootloader或获取root权限,即可在普通安卓设备上部署完整的Kali Linux渗透测试环境。教程涵盖了从环境准备、NetHunter核心安装到配置Kex VNC实现图形桌面访问的全过程,并附带了电脑投屏与常见问题解决方案,旨在打造一个便携的移动安全学习与测试平台。

weixin_29208327的博客 297

【C++】拷贝构造函数和赋值函数

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现 更新时间:2019年03月26日 10:18:25 转载作者:Zmyths 这篇文章主要介绍了C++中构造函数,拷贝构造函数和赋值函数的区别和实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一...

我的笔记本 2943

Java写一条吃满屏幕的贪吃蛇(A*自动寻路算法和一些简单的策略) 二

上一篇文章介绍了一条贪吃蛇的简单实现,这一篇介绍贪吃蛇的自动寻路算法 ,说是自动寻路其实也就是一种遍历地图的算法,如果玩过游戏肯定知道游戏里面一般会有自动寻路功能,贪吃蛇的自动寻路算法也就是实现这个功能。下面慢慢介绍这种算法吧。    最开始,我没有在网上找资料的时候,我对于设计寻路算法的看法是遍历整个地图,将障碍物做上标记,然后找一条能够到达目的地的线路就可以了。所以最开始我用了特别暴力的方式来...

Sober_yang的博客 3632

【C++】五、拷贝构造与赋值构造

文章目录1.拷贝构造1.1 为什么存在1.2 定义2.代码3.参考 1.拷贝构造 1.1 为什么存在 当类的数据成员中没有指针类型的变量时,直接对两个对象进行赋值没有问题。 但是一旦类的数据成员含有指针变量,那么直接对这两个对象进行赋值操作之后,这两个对象的指针都将指向同一块内存。这时,一旦其中一个对象生存期结束,释放该内存,那么另一个对象的指针就变成了野指针!这对程序危害很大 1.2 ...

左耳听风的博客 857

JAVA审批流程,一个简单表结构设计方案By OU

一、表结构设计1.流程表(process)用于存储审批流程的基本信息。字段名类型描述idBIGINT主键,流程IDname流程名称TEXT流程描述DATETIME创建时间DATETIME更新时间statusTINYINT(1)流程状态(0: 停用, 1: 启用)2.节点表(process_node)用于管理流程中的每个审批节点。字段名类型描述idBIGINT主键,节点IDprocess_idBIGINT流程ID,外键关联process.id。

1901

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1524

拷贝构造与赋值构造

拷贝构造: 拷贝构造又称复制构造,是一种特殊的构造函数,负责用一个现有的对象构造一个新的对象,只有一个引用型的参数(对象本身)。 类名(类& ) { } 拷贝函数的参数应该加const保护,但编译器没有强制要求。 编译器会自动生成一个拷贝构造,负责把旧对象中所有的数据拷贝给另一个新创建的对象。 浅拷贝与深拷贝的区别: 如果类成员中有指针,浅拷贝只拷贝指针的值,而深拷贝拷贝...

qq_42685292的博客 797

Xilinx FPGA ICAP原语实现多重配置

众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个FPGA固件呢?

whik1194的博客 4612

C++之拷贝构造、拷贝赋值

C++之拷贝构造、拷贝赋值

YiHeboy的博客 4388

WorkBuddy CAD 审图救命课:约束、单位、尺寸链一次查清,打样前拦住返工

最危险的 CAD 文件不是打不开,而是看起来完整却混用了毫米与英寸、草图欠约束、关键尺寸没有来源。审图任务必须先列规则,再输出问题位置。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、FreeCAD 0.21.2、OpenCascade 7.7 与人工审阅组成一条可复现链路。你会从“一份模拟 STEP 文件、参数表、装配基准与审图标准”出发,得到“单位报告、约束清单、尺寸链风险表与人工复核标记”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶段。

yueyeguzhuo的专栏 264

第二篇:APS智能排产实战:OR-Tools与coptpy从入门到案例

专注于具体的技术实现,包括 OR-Tools 和 coptpy 的详细使用指南、建模技巧、日志解读,以及一个完整的两阶段生产排程案例。适合准备动手开发 APS 系统的工程师和研究者。

算法工程师 454

C++ 拷贝构造函数和赋值构造函数

在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的“三法则”。如果需要手动定义了其中了一个,那么另外的两个也需要定义,通常在存在指针或者前期相关操作的情况下,都需要手动的定义。 复制构造函数与重载赋值操作符实现的大题相...

qq_36553031的博客 1万+

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 990

C++禁用拷贝构造和赋值操作符的作用、语法解析、使用场景和示例

在 C++ 编程中,有时我们希望**禁止对象的拷贝构造和赋值操作**,以避免拷贝操作带来的不必要的性能开销、数据安全问题或者不正确的行为。为了实现这一目的,我们可以禁用类的**拷贝构造函数**和**赋值操作符**。3. **不可复制对象**:有些对象在语义上不应该被复制,比如 `std::unique_ptr` 或互斥锁(`std::mutex`)。**注意**:这种方法虽然可以有效禁止拷贝,但在 C++11 之后已不再推荐使用。2. **单例模式**:为了确保只有一个实例,需要防止拷贝和赋值。

henry747647的专栏 804

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【通俗解释】【生活化示例】C++中构造函数、析构函数、拷贝构造函数和赋值运算符重载

本文通俗解释了C++四大核心函数:构造函数(对象初始化)、析构函数(资源释放)、拷贝构造函数(对象克隆)和赋值运算符重载(对象赋值)。通过手机设置、数据清理、身份证复印和房产过户等生活化示例,形象说明了每个函数的作用和调用时机。文章还对比了四者的差异,并提醒了浅拷贝陷阱和默认函数规则,帮助读者避免常见错误。这些概念是编写安全高效C++代码的基础,理解它们对编程和面试都至关重要。

学习代码 726

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++基础知识 - 赋值构造函数

赋值构造函数 如果没有定义赋值构造函数,编译器会自动定义“合成的赋值构造函数”, 与其他合成的构造函数,是“浅拷贝”(又称为“位拷贝”)。   Human.h #pragma once #include <string> #include <iostream> #include <Windows.h> using namespace std; class Human { public: Human(); ~Human(); Human(strin

骆驼胡杨的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++中类的构造函数、析构函数、赋值函数、拷贝函数

在C++中,类的构造函数、析构函数、赋值函数和拷贝函数是类的特殊成员函数,它们在对象的创建、销毁和复制过程中起着关键作用。

m0_74079831的博客 1814

深拷贝和浅拷贝,拷贝构造、赋值运算符

拷贝构造在如下场景会被调用:(1)函数调用时,函数参数是对象的值传递(2)声明对象同时初始化的时候(而不是声明和初始化分开,因为声明的时候就创建了对象)(3)函数返回的时候,返回对象的值。第 3 种情况,默认情况下有返回值优化,不会调用拷贝构造函数。通过编译参数 -fno-elide-constructors 可以禁用返回值优化。拷贝构造函数的形参必须是引用传递,如果是值传递的话,那么在传递过程中也会调用拷贝构造函数,这样就造成递归调用。如果是值传递,会有编译错误。

weixin_38184628的博客 1565

c++的移动构造, 移动赋值, 拷贝构造, 拷贝赋值

 上代码: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdint.h&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;utility&amp;gt; class Rvalue{ public: Rvalue():data_{n

u010643777的专栏 2314

c++移动构造函数、拷贝构造、赋值构造的区别

拷贝构造函数和移动构造函数的区别。

qq_42176731的博客 578

C++ 赋值构造和拷贝构造

拷贝构造 1、定义 拷贝构造又称为复制构造,是一种特殊的构造函数,当使用一个现有的旧对象构造一个新对象时就会调用拷贝构造函数,拷贝构造函数只有一个引用型的参数(类对象本身) 2、格式: A(const A &a) 如果没有自己实现拷贝构造函数,编译器会自动一个拷贝构造函数,负责把旧对象中的所有数据拷贝给新创建的对象(浅拷贝) 3、拷贝构造分为深拷贝和浅拷贝: 1、如果类中的成员有指针变量的话,那么浅拷贝只拷贝指针变量的值; 2、深拷贝则是拷贝指针变量所指向的目标。 系统自动生成的拷..

a777122的博客 881

C++——拷贝构造和重载的赋值运算符

今天突然被搞蒙,重新复习了一下 多说无益,直接上代码 #include #include <string.h> using namespace std; class A { public: char * x; int y; A() { cout<<“无参构造”<<endl; this->x=new char[0]; this->y=0; } A(i...

New_User_Ling的博客 277

c++拷贝构造函数 && 赋值语句

拷贝构造函数 拷贝构造函数的定义: 同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或拷贝是完全可行的(以为他们具有同样的结构)。这个拷贝的过程只需要拷贝数据成员,而函数成员是公用的(只有一份拷贝)。因此,在建立对象时咳以用同类的另一个对象来初始化对象。这时所用的构造函数成为拷贝构造 拷贝构造函数的特点: 类名与函数名相同 参数是自身类型的引...

LYhani82475的博客 1549

C++之 delete删除拷贝构造函数和拷贝赋值运算符

在 C++ 中,删除拷贝构造函数和拷贝赋值运算符是一种常见的方法,用于防止对象的拷贝和赋值。这在某些情况下是必要的,例如当类管理资源(如线程、文件句柄或网络连接)时,以确保资源的唯一性和避免潜在的资源泄漏或多重释放。

jzjhome的博客 1020

【C++类和对象之拷贝构造、赋值运算符重载】

C++类和对象拷贝构造、赋值运算符重载

小小小智_x0__0x_的博客 2627

C++类对象的复制与赋值

本文主要介绍C++中类对象的赋值操作、复制操作,以及两者之间的区别,另外还会讲到“深拷贝”与“浅拷贝”的相关内容。 本系列内容会分为三篇文章进行讲解。 1 对象的赋值 1.1 what 如同基本类型的赋值语句一样,同一个类的对象之间也是可以进行赋值操作的,即将一个对象的值赋给另一个对象。 对于类对象的赋值,只会对类中的数据成员进行赋值,而不对成员函数赋值。 例如:obj1 和 obj2 是同一类 ClassA 的两个对象,那么对象赋值语句“obj2 = obj1;” 就会把对象 obj1 的数据

qq_20853741的博客 6601
上一篇: Ubuntu 16.04 编译安装opencv 3.4.6过程和 anaconda3/lib/libtiff.so.5: undefined reference to `ZSTD_freeCStre
下一篇: Linux iptables和netfilter 网络防火墙流程详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值