【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

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

   🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

 文章来源地址https://www.toymoban.com/news/detail-831971.html

目录

类的6个默认成员函数

构造函数

特性

 析构函数

特性

 析构的顺序

拷贝构造函数

特性

常引用


前言

    💬 hello! 各位铁子们大家好哇。

             今日更新了类与对象的构造函数、析构函数、拷贝构造函数、常引用的内容
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

类的6个默认成员函数

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

如果一个类中什么成员都没有,简称为空类。 其实,任何类在什么都不写时,编译器会自动生成6个默认成员函数。

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

构造函数

  • 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,在对象整个生命周期内只调用一次。
  • 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

特性

  1. 函数名与类名相同。
  2. 无返回值。(不是void,不需要写)
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。

C++把类型分成内置类型(基本类型)和自定义类型:

内置类型就是语言提供的数据类型,如:int/char...

自定义类型就是class/struct/union等自己定义的类型,

  •  默认生成的构造函数,对于内置类型不做处理,自定义类型会去调用他的默认构造。
  • C++11 打了补丁,即:内置类型成员变量在类中声明时可以给缺省值
  • 如果我们没写任何一个构造函数,编译器才会自动生成无参的默认构造函数,如果写了,就不会生成
  • 无参的构造函数全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为 是默认构造函数。(默认构造函数有3个)
    【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 

如上图,显示没有合适的默认构造函数可用。因为类中有构造函数,所以编译器不会再生成。又因为它只是带参数的,并不是全缺省或者无参的,所以不是默认构造函数,因此发生错误。

 析构函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

特性

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值类型
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数
  5. 编译器生成的默认析构函数,对自定类型成员调用它的析构函数,对内置类型不做处理。
  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

 析构的顺序

下面是例题:

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

 分析:析构的顺序是2、1、3。因为d1,d2是main函数里的局部对象,存储在栈内,要符合后进先出,所以先析构d2,然后再析构d1。而d3是静态的局部对象,存储在另一个单独的区域,在main函数结束后析构,最终顺序就是2,1,3。

变式:

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

分析:func函数中d3是局部的,d4是局部的静态。func函数结束后,析构d3,接着析构d2,d1,最后才是d4.

变式:

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

析构顺序规律:局部对象(后定义先析构)--》局部的静态--》全局对象(后定义先析构)
 


【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

问题:在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数? 

分析: main中创建了Date对象d,d中有Time类的_t。d销毁时,要将_t对象销毁,就要调用Time类的析构函数。因为不能直接调用Time类的析构函数,编译器会调用Date类的析构函数,由于没有显示的写出来,编译器会生成默认的析构函数,然后在内部调用Time类的析构函数。

拷贝构造函数

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用

特性

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。
  3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对内置类型完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。而自定义类型是调用其拷贝构造函数完成拷贝的。
  4. 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

C++规定自定义的类型都会调用拷贝构造。 

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

 注意:拷贝构造时要传引用,不能传值。如果传值,根据C++规定,会调用拷贝构造,这样就会无穷递归下去,发生错误。


【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

分析:在调用func1时要传值传参,就会先调用拷贝构造,然后才能调用func1。


【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

运行时发生错误,显示没有默认构造函数可用。因为Time类中已经有拷贝构造函数了,而拷贝构造也是构造函数,所以编译器不会再生成默认默认构造函数,这时就需要我们自己写出构造函数。注释的第二行是强制编译器生成默认构造函数。


 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

上面的代码运行后会崩溃。 类中只有内置类型,没有显式写出拷贝构造函数,编译器会给出默认的拷贝构造函数,进行浅拷贝。在数组中他们的内容是一样的,s1和s2的数组指向同一空间,当s2析构后,公用的空间已经被销毁了,这时s1又再销毁一次,程序就崩溃了。

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 解决方法如下:

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

进行深拷贝(即重新再开空间),我们自己写出拷贝构造函数即可。 

常引用

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 

b是a的别名,修改b时,a也会跟着改变。如果传参时想要改变外面的,就要传引用,但如果不想改变外面的,就需要用const引用。const引用是别名但是不能修改,即权限的缩小。a是可读可写的,而c只是可读的。 

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 

 x是只可读,而y是可读可写的,不能放大权限。解决方法是在int& y前面加上const。

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 

10是常量,z要用常引用。a+x的表达式返回值是临时对象,临时对象具有常性,也要用常引用。 

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言 

 如果我们只是想传值过去,建议用const引用。因为如果直接用引用,我们将不能直接传常量过去。

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用),C++,c++,开发语言,c语言

d可以给i,但是d不能给int& ri。d给i中间会有类型转换,类型转换时会有临时对象产生,也就是把d的临时对象给i。而d给int& ri也是,中间有类型转换,会有临时对象产生,临时对象有常性,因此要用const引用。 

 

到了这里,关于【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包