初识c++——类和对象

Posted sjp11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识c++——类和对象相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

面向过程和面向对象的初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

什么是面向对象和面向过程?
在这里插入图片描述

好比一个外卖系统,如果是面向过程,则关注:订单——接单——派单
如果是面向对象,则关注:顾客——商家——派送员

1.类的引入

C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
在这里插入图片描述

1.1类的定义

类的定义:struct+名字或class+名字
上面定义的struct student就是一个类。

在这里插入图片描述

class或struct为定义类的关键字,student为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

1.2 类的两种定义方式

第一种: 类中的成员函数声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处
理。
在这里插入图片描述

第二种:将类的声明放在类的.h文件里面,将类的成员函数实现放在.cpp里面实现
在这里插入图片描述
一般情况下,更期望采用第二种方式。

2. 类的访问限定符及封装

在这里插入图片描述

2.1 访问限定符

c++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其
接口提供给外部的用户使用。

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

在这里插入图片描述

在这里插入图片描述

2.2 class定义的类与struct定义的类的区别

如果在类的域里面没加访问限定符,会是怎样的呢?

class定义的类没有加访问限定符会默认class中的成员为private,就是类成员在类外不能直接被访问
struct定义的类没有加访问限定符会默认struct中的成员为public,就是类中的成员在类外可以直接访问

在这里插入图片描述

问题:C++中struct和class的区别是什么?

答:c++中为了兼容c,struct可以去定义结构体,当struct去定义类时,它的class定义是一样的,只是struct定义的类的成员访问默认为public,class定义的类成员访问默认为private。

2.3 封装

封装的本质上是管理,将数据和操作数据的方法封装在类中,想给你访问的定义成public,不想给你访问定义成private或protect ,封装它面向对象,它更加规范和更加严格。隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。一般成员变量定义为private或protect,成员函数定义为public,这样使数据不能直接被修改。

3.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符
指明成员属于哪个类域
在这里插入图片描述

4.类的实例化

用类类型创建对象的过程,称为类的实例化

1.类只是一个模型一样的东西,限定了类中有哪些成员,定义出一个类并没有实际的空间存储它
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

在这里插入图片描述
做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什
么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占
用物理空间做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什
么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占
用物理空间

在这里插入图片描述

5.类对象模型

5.1 如何计算类对象的大小

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大
小?

对象中只保存成员变量,成员对象放在公共代码区域,目的是节省空间。
以上面的定义的类为例
在这里插入图片描述
在这里插入图片描述
一个类的大小,是由该类的成员变量进行计算的,由内存对齐进行计算,如果类中没有成员变量,则为空类,编译器会给一个字节进行来唯一识别这个类。

6.this指针

6.1 this指针的形成

我们先定义出一个日期的类:
在这里插入图片描述

对于上述类,有这样的一个问题:
由类对象可以知道,成员函数是在公共代码区域,d1和d2调用SetDate是调用同一个函数,那么成员函数SetDate是怎么知道要调用d1,或d2呢,将参数分别给d1,d2的成员变量?
c++中通过this指针解决了这个问题。this是成员函数中的一个隐藏的指针,当编译器编译时会增加一个隐含的参数。

在这里插入图片描述

在这里插入图片描述
从上面的图可以得出,this的确存在,而且this时隐藏的,而且每次调用时,都会传给相应的地址给this指针。成员变量前面this->可加可不加。

6.2 this指针的特性

  1. this指针的类型:类类型* const
    2.只能在“成员函数"内部使用
    3.this指针本质是一个成员函数的形参,是对象调用成员函数时,将对象的地址作为实参传递给this形参,所以对象中不存储this指针
  2. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户
    传递

问题:
1.下面程序能编译通过吗?
2.下面程序会崩溃吗?在哪里崩溃
在这里插入图片描述
调用成员函数PrintA时,a的地址就会传给this指针,PrintA要使用a中的成员变量_a,就需要用this指针去解引用找到_a,因为a为nullptr,所以指针越界,程序会崩溃,调用成员函数show时,a的地址就会传给this指针,因为show函数没有引用成员变量,所以就不需要使用this指针,就不会出现指针越界的情况,程序自然就能正常跑起来。

点个赞呗~,
感谢关注!

以上是关于初识c++——类和对象的主要内容,如果未能解决你的问题,请参考以下文章

C++初阶---类和对象

初识Java语言- 类和对象

python基础-第七篇-7.1初识类和对象

day25--python初识类和对象

Delphi的类和对象- 初识类的事件

C++的类和对象