【C++初阶】:类与对象(上)

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

一.面向对象的初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

例如洗衣服

【C++初阶】:类与对象(上)

而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

【C++初阶】:类与对象(上)

二.初步认识类

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数

这里是c语言实现的栈传送门,通过比较就可以知道为什么会出现类的概念了。

【C++初阶】:类与对象(上)
【C++初阶】:类与对象(上)

上面的struct stack就是一个类,可以把一个栈的多个功能写在一个花括号内。在c++中,上面的struct更喜欢用class替代。

三.类的权限

我们对上面的代码进行改进,将struct改成class。

【C++初阶】:类与对象(上)

但是编译器直接告诉我不可访问,为什么struct可以直接编过而class却不能呢?这就涉及到类的权限问题了。

访问权限分为三种
【C++初阶】:类与对象(上)

1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)

插个小帖子,现阶段认为私有和保护是一样的,直到继承时才进行区分。

简单来说,如果你想要函数能在外部被访问,就需要加上public

【C++初阶】:类与对象(上)

那么public的作用到哪里结束呢?直到遇到下一个限定符或者结束。

【C++初阶】:类与对象(上)

上面的public作用到private结束,private向下直到类结束。

总体来说struct和class是没有什么区别的,最大的不同就是struct默认权限是公有,class默认情况是私有,所以上面的代码直接将struct换成class是不可访问的。

四.类的声明和定义

类也可以声明和定义分离,那么是如何做到的呢?现在将上面的代码改造一下。

【C++初阶】:类与对象(上)

我们这里将init函数踢出,只在类里面声明,在fun.cpp里定义。

【C++初阶】:类与对象(上)

这样就可以实现类里函数声明和定义的分离。注意每一个类都是一个作用域,所以在定义时要加上域名,不然就会出现下面无法识别的问题。

【C++初阶】:类与对象(上)

这里编译器就不知道去哪里找_array,_size…符号。

那么我们可以在类里声明内联函数吗?

【C++初阶】:类与对象(上)

答案是不可以,内联函数的声明和定义是不可以分开的,具体原因大家可以看看这篇博客传送门

注意:在类里直接定义的函数会被默认为内联函数(这是c++的规定),所以如果一个函数过长,我们通常将其声明和定义分离出来。当然如果我们直接在类里定义了一个很长的函数,那么它真的就会变成内联函数吗?其实也不是,具体原因可以看看这篇博客传送门

顺便插一个不好的变成习惯

【C++初阶】:类与对象(上)

这里右边的year其实是init的参数year,因为优先使用局部域。private里的year是出于类域的。这里编译器不会报错,但很影响代码的可读性。

五.封装

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)

在c语言中可以直接通过修改_array来达到目的,但这种操作是不规范的。在c++里我们将其设置为了私有,那么就可以强制程序员去调用函数来修改_array,规范了变成。

六.类的实例化

在上面的代码里,我们可以很明显的看到Init函数是声明,push,top…函数是直接在类里定义。那么下面的_array,_size…变量是声明还是定义呢?

【C++初阶】:类与对象(上)

答案都是声明。变量的声明和定义在于是否开辟空间。

【C++初阶】:类与对象(上)

这些变量并非一个一个定义的,而是一起定义的。而定义这些变量的过程就被称为类实例化对象或者对象定义。

【C++初阶】:类与对象(上)

这里举个例子,如果我们将pravate删掉,意味着这些变量可以直接访问,那么我们能直接赋值吗?

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)
【C++初阶】:类与对象(上)

很明显是不能的,类就像是一张图纸,你很明显不能在图纸里放上一把椅子或者桌子,你必须依照图纸将这个房子的空间建出来,才能够往里面放入家具。

七.类的大小

我们创造了一个对象s,那么这个类的大小是多少呢?

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)

答案是12。结论是对象中只储存成员变量,不储存成员函数。注意:就算时也要像struct一样进行内存对齐。如果不太了解的可以看看这篇传送门。

【C++初阶】:类与对象(上)

我们应该怎样理解这个现象呢?其实也很简单,我们再创立一个对象。

【C++初阶】:类与对象(上)

两个对象的_size是一样的吗?很明显不是的。如果我们类比一下,就好像变量是每个房子的厕所,厨房…每个房子都要这些空间并且是独立的。而函数就像小区的花园,篮球场,多户人共用一个就可以了。(当然也可以每户人都建一个花园,但很明显太浪费了)

【C++初阶】:类与对象(上)

总结:每个对象所建立的对象都是独立的,而函数的调用都是同一个函数。

那么我们接着往下看

【C++初阶】:类与对象(上)

这里的A2和A3的大小是多少呢?(ps:这里直接对类求大小和对对象求大小是一样的)。答案都是1

【C++初阶】:类与对象(上)

为什么都是1呢?那么我可以问一个问题,如果都是0字节,那么下面的两个对象如何区分呢?

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)

如果它们是0字节的话,就不会有地址,那么这个类就不能用了。

所以,没有成员变量的类对象,需要1字节,用来占位,表示对象存在,不存储有效数据。

八.this指针

1.特性

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)

大家看上面一段代码,为什么两个打印是不一样的呢?前文我们说到(这篇博客的类的大小部分)类里的函数都是存放在一个公共区域内,所以不同对象调用的都是同一函数,那为什么结果还不一样呢?这里就要提到this指针了。

【C++初阶】:类与对象(上)

可以这样理解,实际上编译器在编译后把函数改成了下面的样子。

【C++初阶】:类与对象(上)

【C++初阶】:类与对象(上)

实际上就是编译器“暗箱操作”,悄悄的改了函数。

2.存储位置

this是形参也就是实参的一份临时拷贝,所以this指针其实是作为栈帧的一部分存在栈里的(如果对栈帧不太了解可以看看这篇博客传送门)。所以在函数调用结束后this就被销毁了。

下面看道例题

【C++初阶】:类与对象(上)

这段代码能成功运行吗?

【C++初阶】:类与对象(上)

答案是可以的,因为虽然p是空指针,但printf函数里并不需要参数,也就是说不需要对this指针进行解引用,那么自然就能正常运行了。

那么我们可以使用::去直接访问Print函数吗?

【C++初阶】:类与对象(上)

答案是不能的,因为这样写就相当于直接丢掉this指针,即使this指针是空指针也依然要传过去。

那么我们可以直接这样写吗?

【C++初阶】:类与对象(上)

答案是不能,因为this指针能在函数里显示使用但不能显示传递,这是语法规定。文章来源地址https://www.toymoban.com/news/detail-421083.html

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

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

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

相关文章

  • 【C/C++】C语言和C++的区别 | 面向过程与面向对象

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c++系列专栏:C/C++零基础到精通 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ c语言内容💖:

    2024年02月07日
    浏览(34)
  • C++初阶--类与对象(1)

    在c语言中,我们会这样写一个栈: 先写出一个栈的结构体出来,然后写出有关栈的函数出来;我们会把对于栈的操作部分拆分出来,所以我们说C语言是面向过程的 ; 而在 C++中,对于结构体来说,还可以把函数也写进结构体中 ; 并且对于结构体变量类型,可以省略struct 上

    2024年02月08日
    浏览(26)
  • C++初阶--类与对象(2)

    对于一个没有成员的类来说,称之为空类; 但空类并非完全是空的,类会自动生成6个默认的成员函数: 概念:构造函数是一种特殊的成员函数,它在创建对象时被调用,用于初始化对象的数据成员。 构造函数和类名相同,并且没有返回类型,甚至不能包含return语句 。 像这

    2024年02月06日
    浏览(28)
  • 【c++初阶】类与对象(下)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(31)
  • 【c++初阶】类与对象(中)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月10日
    浏览(27)
  • 【C++初阶】:类与对象(上)

    C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 例如洗衣服 而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也

    2023年04月22日
    浏览(29)
  • 【C++初阶】类与对象(上)

      我们可以形象的把类比作是一个房子的 设计图纸 ,而对象就是 根据设计图纸设计出来的房子 。 由设计图纸到房子的过程,我们称之为 类的实例化 。 C++兼容C的,所以C中的结构体在C++中也能用,但是 C++把结构体升级成了类 ,也就是说:      1.在C语言中 struct +名称,才

    2023年04月27日
    浏览(29)
  • C++初阶学习第三弹——类与对象(上)——初始类与对象

    前言: 在前面,我们已经初步学习了C++的一些基本语法,比如内敛函数、函数重载、缺省参数、引用等等,接下来我们就将正式步入C++的神圣殿堂,首先,先给你找个对象 目录 一、类与对象是什么? 二、类的各部分组成 1、类的定义 2、类的访问限定符及封装 3、类的作用域

    2024年04月26日
    浏览(39)
  • 【C++初阶】第二站:类与对象(上) -- 上部分

    前言:         C++学习的第二站:类和对象(上)文章的上半部分,知识点:面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装、类的作用域、类的实例化. 目录 面向过程和面向对象初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装

    2024年01月19日
    浏览(98)
  • 【C++初阶】第二站:类与对象(上) -- 下部分

    前言: 本章知识点: 类对象模型、 this 指针 专栏: C++初阶 目录 类对象模型 如何计算类对象的大小 类对象的存储方式猜测 结构体内存对齐规则 this指针 this指针的引出 this指针的特性 C语言和C++实现Stack的对比 C语言实现 C++实现 代码演示         Date类实例化了一个d1对象,

    2024年01月23日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包