C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

这篇具有很好参考价值的文章主要介绍了C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


绪论

本章我们接着对类和对象进行探索,这是一个在我们c++中比较重要的知识点,下面我们才是我们类和对象的更加深入且困难的知识点,希望你能通过这篇文章对类其有更加深入的了解。

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

话不多说安全带系好,发车啦(建议电脑观看)。


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


思维导图:

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

要XMind思维导图的话可以私信哈


目录

1.类的6个默认成员函数

2.构造函数、析构函数

2.1构造函数的调用:

2.2析构函数的细节

3.拷贝构造函数

4.赋值运算符重载

4.1运算符重载:

4.2赋值运算符重载:

5.const成员

6.取地址及const取地址操作符重载


1.类的6个默认成员函数

知识点:

6个默认成员函数:

构造函数、析构函数、拷贝构造函数、赋值运算符重载函数取地址操作符重载、const修饰的取地址操作符重载,对于这6个默认成员函数来说假如你不在对象的类中写操作系统会默认生成一个(所以说所有默认成员函数都不能写成全局的,否则就会和默认生成的发生冲突)


2.构造函数、析构函数

知识点:

在我们写数据结构的时候需要去写初始化和摧毁的函数,而在我们写程序的时候很多时候都容易忘记写 ;

所以c++对此进行了处理就对应的创造出默认成员函数中的构造函数(初始化)和析构函数(销毁

细节:

构造函数:是特殊的成员函数,其实构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

构造函数的写法:

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

5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成(但注意的是默认生成的不会对内置类型(int char ....)进行初始化(其实编译器有些还是会处理的),一般都只会对自定义类型(struct class union....)进行初始化(并且这个自定类型必须有默认构造函数))

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

因为内置类型的原因所以在c++11的时候打了个补丁可以给内置类型加上缺省值:

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

6.如果当成员变量都是自定义类型的时候就可以不用直接写构造函数(反之如果只有内置类型就需要去自己写构造函数/给缺省值)


析构函数:析构函数不是对对象本身的销毁,局部对象销毁工作是由编译器完成的,主要工作是销毁借来的动态空间。对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。并且后创建的先销毁,这里点和栈有点像
析构函数的写法:
1. 析构函数名是在类名前加上字符 ~
2. 无参数无返回值类型
3. 一个类只能有一个析构函数。若未显式定义,同样系统会自动生成默认的析构函数。注意:析构函数不能重载
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数         

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

2.1构造函数的调用:

当创建了一个自己的构造函数时,我们其实也不一定要编译器自动调用,我们也可以自己调用,但要注意自己调用时的写法,他和一般的函数调用有着很大的区别。

在创建类时进行调用的写法

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

进一步优化到:

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

附:

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

而这种优化,就推出了另外一个对于构造函数的点:

也就是默认构造函数只能存在一个

什么是默认构造函数呢? : 无参数的构造函数(上图注释了的)、全缺省的构造函数(上图第二个构造函数)、没写时编译器自动创建的构造函数。


总结:

  1. 一般来说构造函数都需要自己写
  2. 不用初始化的情况
    1. 全是自定义类型(自定义类型会去调用自身的默认构造(全缺省、无参的、默认生成的))
    2. 有内置类型并且有符合的缺省值

练习:

a.自动调用举例演示

直接调用自身构造

此时我们并没有调用析构函数是编译器自动调用

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

b.间接调用构造
创建一个新的对象此时内部都是自定义类型

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

因为pushsk、popsk的自定义类型是Stack所以说需要Stack内有符合的默认构造函数 

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

最终就能顺利的对自定义类型初始化

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏


2.2析构函数的细节

  1. 析构函数会在对象的生命周期结束时自动调用(无论是自己写的还是默认生成的)
  2. 默认生成的同样不会对内置类型进行释放(主要是要释放堆上申请的空间防止内存泄漏(此处不做处理)、对于其余的自定义类型也不需要我们去释放他们在栈上结束时也会归还给操作系统)

总结来说:

  1. 当有动态申请的空间时需要写析构、反之没有动态申请是资源时就不需要我们去写即使有内置类型
  2. 当全部是自定义类型的时候也不用我们写析构函数

3.拷贝构造函数

知识点:

  1.  拷贝构造函数其实是构造函数的一个重载形式
  2. 参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用附:因为当自定义类型传值调用时要先调用拷贝构造来进行传参时的拷贝、然而在拷贝构造中的参数类型假如我们不用引用,那么就又在拷贝构造处进行了自定义类型的传值调用,这样就会导致无限循环)无穷递归展示:C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏当我们用引用接收(用指针也行),就能解决这个问题C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
  3.  一般我们会在拷贝构造中的参数加上const防止被改变C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
  4. 同样当我们自己不写拷贝构造时,编译器会自动生成     

    1. 对内置类型进行浅拷贝、值拷贝(完成字节序的值拷贝, 直接将数据拷贝过去)
    2. 对自定义类型会调用他们自己的拷贝构造,过程可能是浅拷贝 / 深拷贝 (针对申请的空间)

  5. 拷贝构造函数典型调用场景:

    1. 使用已存在对象创建新对象(拷贝构造)

    2. 函数参数类型为类类型对象(引用)

    3. 函数返回值类型为类类型对象(引用)

细节:

  1. 深拷贝和浅拷贝的区别: 深拷贝是针对申请的空间的,对一个动态申请的空间进行拷贝时,不能像内置类型那样直接完成字节序的拷贝(浅拷贝),如果这样会导致拷贝后,两个对象指向同一个申请的空间,当一边改变时会导致另一边受影响 / 他们会重复的进行析构函数释放同一块空间而报错,所以说此时就需要我们自己去写一个拷贝构造(深拷贝,具体看下图,就和构造函数差不多不过要有参数且必须是类对象的引用类型的,然后内部就再申请一块空间给*this,然后将数据拷贝的到新空间中即可,来防止这样的错误发生。C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
  2. c++规定对内置类型来说是直接拷贝(浅拷贝),对自定义类型来说要进行拷贝构造

4.赋值运算符重载

知识点:

4.1运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表。其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator+运算符符号。
函数原型:返回值类型 operator操作符(参数列表)


总结来说:运算符重载就是让自定义类型也能和内置类型一样去使用一些操作符(+ - * /)为此去创建一个专属于自定义类型的操作符

如:

此时这个+=就是一个运算符重载,他其实会其调用我们写好的运算符重载函数 

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏


细节:

  1.  (  .* ) ( :: ) (sizeof )  (?  :) ( . )  注意以上5个运算符不能重载
  2. 是否要去对重载运算符,取决于对你是否需要、是否有意义
  3. 注意对于在写赋值运算符重载时需要把返回值写成 Date &  因为我们需要连续赋值C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
  4. 用于内置类型的运算符时不能改变其含义,例如:内置的整型+,不能改变+的含义
  5. 不能通过连接其他符号来创建新的操作符:比如operator@

4.2赋值运算符重载:

  1. 知识点:

本质也是运算符重载,但是赋值运算符是一个默认成员函数

参数类型:const T&,传递引用可以提高传参效率
返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
返回*this :要复合连续赋值的含义

T & operator=(const T&)  其中T是对象名 如 Date& operator=(const Date& d1)

细节:     

  1. 我们需要在赋值时分清构造函数和运算符重载的区别C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
    1. 构造函数是在一个对象给另一个对象初始化时的赋值操作(Date d3(d1) 等价于 Date d3 = d1)
    2. 运算符重载是对两个已经创建好的对象进行时的赋值操作       
  2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝(和拷贝构造一样,自定义去调用其赋值重载,内置类型进行浅拷贝),所以说对于像Stack这种不全是内置类型成员的对象需要自己去写一个赋值运算符重载
  3. 赋值运算符只能重载成类的成员函数不能成重载成全局函数(因为他是默认成员函数,当写在全局时,类就会再默认生成一个,这样就会发生冲突)

练习:

实现cout 、 cin

这是cout  、cin 所在的类分别是ostream  、 istream

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

ostream& operator<<(ostream& out,const Date& d)//返回值是 out 为了可以连续使用
{
//ostream是cout的类对象,也是库iostream定义的
	out << d._year << "年" << d._month << "月" << d._day << "天" << endl;
//内部就把out当cout使用即可
	return out;
}

istream& operator>>(istream& in, Date& d)//同理要返回 istream& 
{
	in >> d._year >> d._month >> d._day;//同理 ....
	return in;
}

注意因为<< >> 他们有两个操作数 (cout << d1;)

而若是 成员函数 的话第一个参数的位置一定是   *this  , 而我们需要把第一个参数放成 cout

所有对此我们重载 <<  >> 时不能写成 成员函数 而是需要写成一个全局函数

并且因为我们需要使用到  成员日期类对象的成员变量   所以我们要使用到一个超纲的知识点   友元函数,加上友元函数后我们就能    直接在全局函数中去使用类中的私有  

在类中写: friend ostream& operator<<(ostream& out,const Date& d)


5.const成员

知识点:

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
总结来说就是为了改变this指针类型,将this指针的类型改成const Date ...

细节:

  1. 我们可以把所有不需要改变成员变量的成员函数全部写成const成员型
  2. C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

向上面这种没对this加const当遇到const类型时就不行了,所以为了防止这种情况我们对不需要改变的尽量都加上const , 这样对于正常的 Date -> const Date 算是范围的缩小 , 而对于const那也能使用了


练习:

实现日期类


6.取地址及const取地址操作符重载

知识点:

这两个是剩下的最后两个默认成员函数,还是比较简单的,就是会默认重载取地址操作符

对此直接通过代码可以更好的展示:

默认生成的:
C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

重载自己的:

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏


本章完。预知后事如何,暂听下回分解。

持续更新大量C++细致内容,三连关注哈文章来源地址https://www.toymoban.com/news/detail-441239.html

到了这里,关于C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++初阶--类与对象--const成员和日期类的实现

    将const修饰的成员函数称之为const成员函数。 在一个成员函数里面,对于this指针指向的对象,是隐藏式的,没有办法用常规的方法去修饰它,所以我们是这样进行修饰的: 注意事项: date.h date.cpp 这里采用多文件编程的方式,所以在date.cpp中,是在Date类外使用的,需要加上作

    2024年02月05日
    浏览(49)
  • ES6知识点汇总(3)--对象

    1、属性的简写 ES6中,当对象键名与对应值名相等的时候,可以进行简写 在函数内作为返回值,也会变得方便很多 注意:简写的对象方法不能用作构造函数,否则会报错 2、属性名表达式 ES6 允许字面量定义对象时,将表达式放在括号内 表达式还可以用于定义方法名 注意,属

    2024年02月13日
    浏览(41)
  • 学习C++:C++进阶(六)如何在C++代码中调用python类,实例化python中类的对象,如何将conda中的深度学习环境导入C++项目中

    目录 1.应用场景 2.场景:利用maskrcnn深度学习网络实现语义分割 3.CMake配置python解释器

    2023年04月22日
    浏览(42)
  • 一文让你深入了解JavaSE的知识点

    ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人主页:xiaoxieʕ̯

    2024年02月04日
    浏览(43)
  • 软件工程——第12章面向对象实现知识点整理

    本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 1. 面向对象语言技术的特点?

    2024年02月15日
    浏览(49)
  • JS小知识点:在定义对象的时候,用变量值作为对象属性名 参考:

    有没有一种情况,在定义一个对象时,对象的属性名由一个变量的值来决定的?而且是一步到位,简单实现的? 我们知道对象有时被称为 关联数组 ,访问对象属性值的时候可以使用括号表示法(比如 objectName[propertyName]),那定义的时候可以借签这样的方式来实现吗? 我们

    2024年02月10日
    浏览(37)
  • 面向对象——python中类的创建

    面向对象编程——Object Oriented Programming,简称 OOP ,是一种以对象为中心的程序设计思想。很多高级开发语言都是面向对象的,例如,如雷贯耳的Java、谷歌新推的Kotlin、开发iOS的Objective-C、苹果新推的Swift,以及C++、C#等都是面向对象的。Python也不例外,这篇文章将介绍python中

    2024年02月03日
    浏览(35)
  • C++碎知识点

    二叉树 由 n个节点构成的形态不同的⼆叉树 同余符号 定义设m是大于1的正整数,a,b是整数,如果m|(a-b),则称a与b关于模m同余,记作abmod(m),读作a同余于b模m。 符号= 按位与 后赋值 C语言中计算优先级 1LL 1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转

    2024年02月12日
    浏览(48)
  • 软件工程——第9章面向对象方法学引论知识点整理

    本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 1.当前最好的软件开发技术是? 2.面向对象的原则是什么?

    2024年02月13日
    浏览(48)
  • 亚马逊认证考试系列 - 知识点 - 对象存储S3考点介绍

    Amazon S3(Simple Storage Service)是AWS提供的一项面向Web开发人员的在线存储服务。它可以为互联网上的任何数量和任何类型的数据提供可扩展的存储空间。 Amazon S3的核心功能是存储和检索数据,具有高度的可扩展性、安全性、耐用性和性能。S3 的可扩展性表现在以下几个方面:

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包