【C++】构造函数,析构函数,拷贝构造,运算符重载,const 成员

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


默认成员函数:如果不显示,编译器默认生成

构造函数

构造函数:是一个特殊的成员函数,函数名与类名相同,专门用于初始化类对象

  • 函数名与类名相同
  • 无返回值,没有被声明为void类型
  • 对象实例化时编译器自动调用Date d1,或 Date d2(2023, 4, 21)
  • 构造函数可以重载,一个类中可以有多个构造函数用于多种初始化方式,其中无参数的构造函数为默认构造函数
  • 构造函数:无参数构造函数,全缺省构造,半缺省构造,编译器自动成(无参数和全缺省只能存在一个,否则调用时会产生歧义)
  • 若不主动显示,编译器将会自动生成默认构造函数
     

关于编译器默认生成的构造函数

  • 内置类型的成员不做处理
  • 自定义类型成员,会去调用该自定义类型成员的无参数默认构造函数

对于成员有自定义类型成员的类,不主动显示(定义)构造函数时,编译器会自动生成默认构造函数,在对象实例化时,该自动生成的默认构造函数会去调用该自定义类型成员的默认构造函数,从而完成对象的初始化。
即这种情况下,编译器自动生成的默认构造函数的作用是调用,而不是直接产生效果

  • 建议对内置类型成员设置缺省值

析构函数

对象在销毁时自动调用析构函数,完成的是对象中资源清理工作

  • 构造函数名:~classname
  • 无返回值类型
  • 一个类中只能有一个析构函数
  • 析构函数不能重载
  • 对象生命周期结束,编译器自动调用析构函数

编译器自动生成的析构函数规则同构造函数类似

拷贝构造函数

Date d2(d1);
Date d3 = d1;

  • 拷贝构造函数是构造函数的一个重载
  • 参数只有一个且必须为类类型对象的引用
  • 参数最好用const修饰,以保护引用的原对象数据,同时避免权限放大
  • 若未显示,编译器会自动生成默认的拷贝构造函数,该拷贝构造默认按字节完成拷贝,即浅拷贝或值拷贝
  • 拷贝构造作用场景:
    • 使用已有类型对象创建新对象
    • 函数参数为类类型对象传值传参
    • 函数返回值以类类型对象的值返回
       

关于函数传参

void func(Date d)
{}

Date d1;
func(d1);

  • 调用func函数时需要传参,这里为传值传参,要为d1创建一份临时拷贝,拷贝d1要调用拷贝构造来生成这份临时拷贝
  • 对于自定义类型,必须调用拷贝构造完成,编译器只能对内置类型进行拷贝
  • 此外,函数返回对象时也会调用拷贝构造,(返回引用时不会拷贝构造

关于默认生成的拷贝构造函数

  • 默认生成的拷贝构造函数完成的时浅拷贝,对于内置类型会产生作用

  • 当成员变量中有指向堆空间的指针时,默认拷贝构造的浅拷贝只会拷贝这个指针,结果是拷贝了一个指针指向了同一块空间,但空间没有发生拷贝,就会导致一些麻烦

  • 若对空间中的数据进行操作,会相互影响

  • 析构时,拷贝的对象和原对象两次析构,会对同一块空间析构两次,会报错

  • 为避免上述情况,主动显示拷贝构造以实现深拷贝
     

什么情况下需要显示拷贝构造?

自己实现的析构函数中会释放空间,涉及资源管理时,需要主动实现拷贝构造

 

运算符重载

运算符重载的意义:使运算符能按照自定义的方式作用于自定义类型

赋值运算符重载

  • 赋值运算符重载必须是成员函数
  • 对于内置类型,无须显示实现,编译器生成的默认赋值重载能通过浅拷贝完成任务
  • 对于自定义类型,若涉及资源管理,则必须实现赋值运算符重载
     
  • 赋值重载是针对于两个已经实例化的对象
  • 为支持连续赋值,定义时需设置返回值以作为左值参与到连续赋值
  • 支持连续赋值的运算符都需要设置返回值

 

其他运算符重载

  • 区分与函数重载,使用operator定义
  • 重载参数按照操作数的顺序定义
  • 使用重载的运算符时注意优先级
  • 可以定义在全局,但建议直接声明在类中

 

  • operator不能连接操作符以外的符号
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符含义不能改变
  • 作为类成员函数重载时,注意考虑第一个隐含的this参数

 

const 成员

使用 const 修饰类成员函数以避免权限放大问题
void Func() const; const 修饰的是隐含参数this,以保护自身对象

  • 内部不改变成员变量的成员函数要加上 const
  • 类中可以同时有普通成员函数和const成员函数
int& operator[](int i);//可读可写
const int& operator[](int i) const;//只可读

此外,取地址操作符重载是默认成员函数,一般不用自己定义文章来源地址https://www.toymoban.com/news/detail-423990.html

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

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

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

相关文章

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

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 拷贝构造函数,又称复制构造函数,是一种特殊的

    2024年02月05日
    浏览(49)
  • C++ -3- 类和对象 (中) | 拷贝构造函数 & 赋值运算符重载

    示例: 拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象 无穷递归 ? Date(Date d){……} 首先,分析 传值传参的过程 传引用传参 : 没有拷贝 的过程,直接传 传值传参: 内置类型 编译器可以直接拷贝(浅拷贝/值拷贝——一个字节

    2023年04月19日
    浏览(80)
  • 【C++】:类和对象(中)之拷贝构造函数+赋值运算符重载

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

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

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

    2024年04月17日
    浏览(48)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

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

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

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

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

    2024年02月08日
    浏览(65)
  • c++拷贝构造与赋值运算符重载

    目录 目录:         1:拷贝构造         2:赋值运算符重载                  前言:在上一章我们已经学习过了,构造与析构这两个默认成员函数了,接下来让我们一起来学习另外两个重要的默认成员函数。         首先让我们来讲一下默认成员函数这个概念,所谓

    2024年02月08日
    浏览(53)
  • 【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

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

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

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

    2024年02月13日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包