【C++笔记】C++之类与对象(上)

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

1、类是结构体的升级

C++的一个显著特征就是兼容C语言,所以C++把结构体“升级”成了“类”,之所以是“升级”是因为,在C++中的结构体及支持以前C语言的结构体的玩法,也可以支持C++中类的玩法。
例如单链表节点这个类,我们既可以写成纯C版本:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
用纯C的写法,我们每次要定义一个节点变量的时候,都必须要加上一个前缀struct,非常的麻烦。
而且就算是我们用了typedef,在结构体内部也还是不能直接用typedef后的符号,因为在结构体内部typedef还没有起作用:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

非常麻烦!
但在C++中,我们就不必要担心这些情况,因为在C++中,结构体也被当成了类,而类是直接可以类名来定义变量的:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
不管类内部还是外部,我们都可以直接使用类名来定义变量。

2、类中可以定义的东西

既然类是结构体的“升级”,那么内在结构体中定义的东西也一定能在类中定义,所以类中能定义的包括:
各种变量:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
数组:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
还有枚举和结构体等等:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
几乎可以定义所有的东西:

但C++的类除了可以定义以上这些东西之外,还一个定义一个类独有的东西:“成员函数”,
有了成员函数,我们在管理结构体中的各个成员的时候就可以更方便,而不需要每写一个函数就需要传参。
例如栈这个类的初始化:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
这是因为类划分了一个“类域”,在成员函数被调用的时候,就回到类中去寻找各个变量,这就不需要我们老是传递参数了。
而且使用起来也很简单,就像以前结构体访问成员变量一样:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
而这个“public”是一个类访问限定符。

3、类访问限定符

在一个类中,我们总有些东西是不想被外面访问到的,也总有一些东西是想要对外开放的,这时候就需要访问限定符来管理了。
访问限定符一共有三个:

public(公有)
protected(保护)
private(私有)

第一个public表示公开,由这个访问限定符修饰的成员不管是在类内部还是外部,都可以自由访问:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
而第二个protected,我们现在暂且认为它和public是一样的,因为这个访问限定符实在以后的类的继承中才能显现出区别的。
第三个private表示私有,被这个访问限定符所修饰的成员就只能在类里边访问,而在类外边是访问不到的:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

而要是我们不显示的添加访问限定符,在类和结构体中也是有默认的访问限定符的。
其中,类的默认访问限定符是private:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
而结构体的默认访问限定符是public:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

4、类的声明

大家是否有过一个疑问?就是我们平时写的这样一个类:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
它到底是声明还是定义呢?
首先我们要明确声明和定义的区别,声明只是告诉编译器,有这么一个函数或变量存在,而定义则是为这个函数或变量开辟空间。
所以我们就可以想接下来这样来验证上面所写的到底是声明还是定义:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
我们发现用域作用限定符是访问不到成员的,这就说明编译器并没有为这个类开辟空间。所以编译器找不到这个成员的地址。

5、类的实例化(定义)

有声明就得有定义,其实我们平时创建的一个类对象就是一个类的定义,也称为类的实例化:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

这样,编译器才会真正开辟空间。

6、类的大小的计算

其实类的大小计算遵循着结构体内存对齐的规则,例如下面这两个类和结构体:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
从结果就可以看出类大小的计算也是遵循着结构体内存对齐的那套规则的。
同时不管我们是使用类名来计算的小还是使用类对象来计算大小,都是可以准确算出一个类的大小的:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

这是因为就算我们没有实例化类对象,但通过类名我们还是可以找到类的声明,类的生命虽然没有开辟空间,但也相当有了一张“图纸”,我们可以通过这张“图纸”来计算出类的大小。

但是有一点是不一样的,就是当类中存在成员函数的时候:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言

我们发现,就算类中添加了成员函数,类的大小还是没有发生改变,这是为什么呢?
其实这是一种节约资源的做法,我们不妨先想一想,我们平时定义的各个类对象,他们的成员变量是否是相同的变量?
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
答案显然不是的。
但它们所调用的函数是不是同一个呢?
答案是是的,因为函数的逻辑都是一样的,而各个对象的成员变量的值是可能各不相同的,不相同的只当然不能共用同一个变量了,但是相同的逻辑就只需要一段相同的指令就行了。
所以,类中就没有必要存储成员函数了。类中的成员函数其实是放在代码段中的。

但要是,我有一个“空类”,也就是类中没有成员变量也没有成员函数,那这个类的大小又该是多少呢?
我们可以来验证一下:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
我们可以看到,空类的大小是1字节。
其实这一字节的作用只是用来占位而已,只是表示这个类存在过。

7、this指针

经过前面的叙述,我们已经知道成员函数并不存储在类中。那么问题来了,既然不存储在类中,那么在调用的时候就必定需要传参啊,那为什么在写成员函数的时候不需要传递成员变量呢?

其实,所谓的“不用传参”只是表面现象而已,其实只是把传递对象的工作交给了编译器来做而已。
事实上,我们平时写的成员函数还有一个隐藏的参数:“this”指针,这个指针是一个类对象的指针,也就是调用函数的对象的指针:
例如下面这个函数,编译器会在底层将它处理成这样的一个函数:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
但这是规定给编译器做的工作,也就是说我们不能和编译器“抢工作”,不能显示的将this指针,写在参数列表中。

但我们却可以在类当中使用它,例如上面的这个函数也可以这样写:
【C++笔记】C++之类与对象(上),C++之路,c++,笔记,开发语言,c语言
但是像这种单纯访问成员变量的情况,我们一般都不会显示的将this写出来,因为编译器自己会自动补上,何必自己给自己找麻烦呢?文章来源地址https://www.toymoban.com/news/detail-652576.html

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

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

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

相关文章

  • 【C++初阶】之类和对象(下)

    📃 博客主页: 小镇敲码人 💞 热门专栏:C++初阶 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么?你问我

    2024年04月16日
    浏览(58)
  • C++初阶之类和对象(下)

    在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值 ,而不能称作初始化。因为 初始化只能

    2024年02月13日
    浏览(21)
  • C++初阶之类和对象(中)

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

    2024年02月12日
    浏览(22)
  • 重生c++系列之类与对象(中篇)

    好的继上期,我们今天带来c++类与对象系列的继续学习。 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为

    2024年02月11日
    浏览(28)
  • 0基础入门C++之类和对象中篇

    1.类的6个默认成员函数 通过类和对象上篇的学习,我们知道知道如果一个类中没有成员变量,也没有成员函数,啥也没有,那我们把它叫做空类。 比如 : class Date {}; 那么空类中真的什么都没有吗? 并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

    2024年02月12日
    浏览(27)
  • 0基础入门C++之类和对象下篇

    1.再谈构造函数 首先我们先来回忆一下构造函数: 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次 。即构造函数其实就是帮我们对类的成员变量赋一

    2024年02月11日
    浏览(24)
  • C++心决之类和对象详解(中篇)(封装入门二阶)

    目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置++和后置++重载 7.const成员 8.取地址及const取地址操作符重载 如果一个类中什么成员都没有,简称

    2024年04月26日
    浏览(18)
  • 【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数

    如果一个类中什么成员都没有,简称为空类 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 由于编译器的优化 我们未给_a赋值 这里是不会报

    2024年02月08日
    浏览(36)
  • C++学习之路(C++初阶)——类和对象(上)

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : C++初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言       🛰️友友们的支持是本博主更新的动力   本博客主要为学习C++类和对象内容做准备,开头补充

    2024年02月07日
    浏览(25)
  • 【C++进阶之路】类和对象(中)

    1.构造函数——完成对象成员变量的初始化 2.析构函数——完成空间(主要是堆)的释放 3.拷贝构造——用一个已初始化的对象初始另一个正在初始化的对象 4.赋值重载——用一个已初始化的对象赋值给另一个已经初始化的对象 5.取地址重载——对一个不加const的对象取地址 6.

    2024年02月03日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包