c++拷贝构造与赋值运算符重载

这篇具有很好参考价值的文章主要介绍了c++拷贝构造与赋值运算符重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录:

        1:拷贝构造

        2:赋值运算符重载

        


              

        前言:在上一章我们已经学习过了,构造与析构这两个默认成员函数了,接下来让我们一起来学习另外两个重要的默认成员函数。

        首先让我们来讲一下默认成员函数这个概念,所谓的默认成员函数,就是只要是类,类成员中就必定会含有这6个默认成员函数,空类也含有这6个默认成员函数。接下来让我们一起来学习拷贝构造与赋值重载吧。 

1:拷贝构造

        概念:函数名与类名相同,只有一个形参,且该形参是对本类类型对象的引用(一般用const修饰),在用已存在的类类型对象创建新对象时编译器自动调用。

        拷贝构造的特点:

        1:拷贝构造其实是构造函数的一种重载方式。(形参为该类类型对象的引用)

        2:拷贝构造只有一个参数,且该参数必须为该类类型对象的引用,如果是该类类型(传值),那么会形成无限递归,编译器在编译的时候会报错。 

        3: 当我们在一个类中并没有写拷贝构造函数的时候,编译器会自动生成一个默认的拷贝构造函数,这个默认的拷贝构造会按照字节拷贝的方式来进行拷贝,这种方式又被称为值拷贝(浅拷贝)。

        4:拷贝构造对于内置类型的成员完成值拷贝,对于自定义类型的成员调用它的拷贝构造,一般自定义类型成员的拷贝构造需要写一个深拷贝构造函数。

        注意:当类中没有申请内存资源的时候我们拷贝构造可写可不写,但是当类中申请了内存资源的时候我们就一定要写拷贝构造,不然我们程序会崩溃掉。

        我们通过图来解释上面的语法。

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

        那么为啥在传值的时候会报错呢?我们来分析一下 

        

         而当我们将拷贝构造的形参设置为,该类类型对象的引用时,引用并不是实参的拷贝,引用是实参的别名,所以不会形成无限的拷贝构造,也不会出错,真正才是拷贝构造规定的语法。

                c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

 对于语法3

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

             我们已经将我们写的拷贝构造函数给注释掉了,可是为什么我们在用d2拷贝d1的时候,还是完成了拷贝呢?这里是因为我们不写拷贝构造的时候,编译器会自动生成一个拷贝构造来完成值拷贝(浅拷贝)的工作,这也是默认成员函数牛逼的地方。

            可是当编译器会自动生成默认的拷贝构造的时候为什么我们还要学习拷贝构造函数的写法呢?

        这是因为呀,这个类并没有向内存中申请资源所以可以不用写拷贝构造利用编译器的拷贝构造就能够完成相应的功能,而当我们的类向编译器申请了内存资源呢?那又会发生什么呢?

        因为编译器的值拷贝是从内存中按照字节序来进行拷贝的,所以当我们的对象调用析构函数的时候,会对同一块空间完成两次析构,那么就会有非法访问内存的现象,编译器就会运行崩溃。

        如下图的描述:

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

       所以我们可以这样认为,我们学习拷贝构造,是为了当我们类对象向内存中申请空间的时候,我们就需要自己来写拷贝构造,这个用来解决申请内存空间的拷贝构造又叫做深拷贝。

        比如说下面的一个例子,我们定义一个Stack类

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

        假设我们使用的是它默认的构造函数。

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

        这里的程序就终止了,因为我们出变量的生命周期会自动调用它析构函数,所以就导致了释放两次同样的内存空间导致程序崩溃,调用析构函数的顺序与构造变量的顺序相反,在这里应该先调用的是st1的析构,在st调用的时候指针则会访问异常。

        所以我们应该自己来写一个构造函数,使得拷贝的时候并不指向同一块空间。

        如下代码 这也就可以使我们释放的时候并不是释放同一块空间

c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

        当成员变量开辟空间的时候,我们需要自己来写拷贝构造函数,来完成深拷贝。

        下面是几个拷贝构造常用的几个场景

        1:用一个已知对象去创建另外一个对象

        2:函数参数类型为类类型对象

        3:函数返回值为类类型对象

        到这里我们的拷贝构造就讲解完毕了,然我们进入下一个知识点的讲解

        2:赋值运算符重载函数

        在讲赋值运算符重载函数之前,我们得先学一下运算符重载这个知识点。

        我们知道对于我们的内置类型(int char double....)变量来说,他们能够使用运算符来直接进行+-*/...等操作,这些变量的操作编译器会自动来识别,而对于自定义类型来说编译器并不能直接翻译,因为自定义类型比较复杂所以编译器并不能够识别,这也就需要程序员自己实现。

        运算符重载:用来解决自定义类型对象使用运算符的问题。

       函数名为:operator 运算符  

      其实运算符重载与普通函数的差别,只是运算符重载具有特定的函数名,其他的与普通函数一样。我们用日期类来举例,运算符重载的定义。

        c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言

        这就是一个日期类的运算符重载的定义,与普通函数并没有差别很大。

        我们在定义运算符重载的时候需要注意的有以下几点

        1:我们并不能用operator运算符来增加新的运算符,必须与我们内置类型相似的。

        2:运算符重载的一个参数必须是类类型的,因为运算符重载是用来解决自定义类型的使用运算符的问题。

        3:我们不能改变运算符的意思,比如说operator+,我们并不能改变原有+的含义。

        4:当运算符重载函数作为类成员函数的时候,函数的形参比操作数永远少1,因为我们会将左操作数当作this指针传进来 。

        5: .* :: sizeof  ?: .这5个操作数并不能形成运算符重载

        有了运算符重载这个知识,我们就可以来学习默认成员函数的赋值运算符重载函数了,

        其实赋值运算符重载函数,也就是operator= 这个函数名的实现。

        赋值运算符重载函数当我们不写的时候编译器会默认的生成一个值拷贝,赋值运算符对于成员向内存开辟了空间那么我们的赋值运算符就要写深拷贝,与拷贝构造类似需要自己开空间。

        当我们使用赋值运算符重载函数的时候必须在类中实现不能在类外,因为当我们在类外实现的时候,因为编译器会看到我们类中并没有显示的写赋值运算符重载函数,所以就会默认生成,导致会有两个赋值运算符重载函数,会有冲突。

        赋值运算符重载的规则

        1:返回值为const 类名&   

        2:参数也是 const 类名&   用引用来提高效率

        3:返会*this,*this是左边操作数如  j = i+=5;  这里i+=5返回的是i。

        4:检查自己是否给自己赋值(自己给自己赋值不会报错,但是这样没什么意义)

        

        关于前置++与后置++的区分   i++,++i

        我们知道++运算符的函数名应该为  operator++,那么我们该如何来区分 前置与后置呢?

       在这里我们可能需要利用函数重载的概念来区分,因为他们两的函数名相同,所以我们可以利用参数使得它们区分。

        c++规定,在参数中加了如:operator(int)有形参的就是后置++,未有形参的就是前置++

     

    c++拷贝构造与赋值运算符重载,c++语法,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-717066.html

到了这里,关于c++拷贝构造与赋值运算符重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】:类和对象(中)之拷贝构造函数+赋值运算符重载

    在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢? 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调

    2024年02月06日
    浏览(35)
  • 【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 我们实现了,编译器就不会生成了 构造函数是

    2024年02月21日
    浏览(35)
  • 【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】三、类和对象 (面向过程、class类、类的访问限定符和封装、类的实例化、类对象模

    2024年02月05日
    浏览(40)
  • 【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

      拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) ,在用已存在的类类型对象创建新对象时由编译器自动调用。 1. 拷贝构造函数是 构造函数的一个重载形式 ; 2. 拷贝构造函数的 参数只有一个且必须是类类型对象的引用 ,使用传值方式编

    2024年02月03日
    浏览(33)
  • 【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 本篇主要内容:类的6个默认成员函数中的 拷贝构造函数 和 赋值运算符重载 在上篇文章中我们讲到了类的默认成员函数的

    2024年04月17日
    浏览(34)
  • 【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

    🔑日期类的实现,将按以下声明依次进行,其中因为Print函数比较短,直接放到类里面让其变成内联函数 🔑而我们实现日期类经常要用到某月有多少天,在这里先把获得某月有多少天的函数实现出来。实现时先检查传参有没有问题,在注意把数组设置成静态的,出了作用域

    2024年02月08日
    浏览(49)
  • 【C++】构造函数,析构函数,拷贝构造,运算符重载,const 成员

    默认成员函数:如果不显示,编译器默认生成 构造函数:是一个特殊的 成员函数 ,函数名与类名相同,专门用于 初始化类对象 函数名与类名相同 无返回值 ,没有被声明为void类型 对象实例化时 编译器自动调用 , Date d1 ,或 Date d2(2023, 4, 21) 构造函数可以重载,一个类中可以

    2023年04月24日
    浏览(55)
  • 【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本章重点: 本篇文章将详细讲解拷贝构造函数 和运算符重载,并介绍const成员的概念 拷贝构造函数和运算符重载 是类和对象中六大默认成员函数

    2024年02月14日
    浏览(30)
  • C++的六大“天选之子“拷贝构造与与运算符重载

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::讲解C++中有关类和对象的介绍,本篇是中篇的第结尾篇文章,讲解拷贝构造,运算符重载以及取地址重载符. 金句分享: ✨别在最好的

    2024年02月13日
    浏览(38)
  • 【C++】类和对象(中)之拷贝构造与运算符、操作符重载

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 我们继续学习默认成员函数,本篇文章博主带来的是拷贝构造函数与运算符、操作符重载的讲解,并且还有

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包