【C++】七、类和对象之面向对象语言oop、C++三大特征、this指针等

一、C面向过程语言、C++面向对象语言

【C语言- -面向过程语言】

C语言是面向过程的语言,设计思想是将属性和行为分开,结构体里面定义成员属性,然后在外面写了函数。想要将属性和行为结合,需要用到函数指针,导致代码理解难度增大。

【C++语言- -面向对象语言OOP】

为了解决C语言模拟现实世界难度大的问题,有了C++,一种面向对象的语言OOP,它将现实世界和计算机世界进行了映射,用计算机语言模拟现实世界,可以通过一张图体现:

在这里插入图片描述

我们可以从 上图总结出一些概念:

  • 实体是我们现实世界中存在的东西,如学生,水杯,货品等;实体具有属性,如学生有学号,姓名等信息;实体可以做一系列的行为,如学生学习,吃饭等。
  • 将实体我们可以抽象为一种数据类型,用相应的数据结构,变量来表示属性和行为。
  • OOP思想就是将现实世界和计算机世界进行模拟实现:类抽象模拟ADT(抽象的数据类型),对象模拟实体。
  • 类就是一种抽象的数据结构,属性就是定义变量,称为成员变量,行为就是函数称为成员函数。用其泛化的表示一种类型的实体。
  • 类无法直接使用,必须实例化对象,才可以使用。可以这样理解,学生这个泛化的概念不能作为一个实体在社会上生存,必须进行实名制到一位学生,如张三。这个过程就是实例化的过程。
  • 行为可以看到属性,即成员方法可以使用本类的成员变量

那么它们基本的语法使用如下:

  • class是类标识,如

    class A{}; //表示定义了A类
    
  • 生成对象,使用【类名 对象名】格式生成对象,如:

    A a; //A类实例化对象a
    
  • 【对象.成员方法】,表示对象调用成员方法,如:

    a.show();//a对象调用A类中的成员方法show()
    

总结来说,OOP面向对象就是:设计类,生成对象,定义属性,实现行为

二、关于C、C++的比较

(一)class和struct的区别

  • class默认 访问限定符为私有的。
  • struct默认 访问限定符是公有的。

(二)空结构体大小?空类大小?

  • C语言中不能定义空结构体,因为在C语言中类型代表模子,是根据模子来刻出对应类型的内存块。如果定义空结构体,表示模子不存在,那么怎么去刻内存块,应该起什么名字,所以不允许定义空结构体。
  • C++中空结构体的大小为1字节,因为在C++中将结构体当作类处理的,但还是有细微的差别,如访问限定符一个默认私有一个默认公有,可以在结构体中使用访问限定符,定义函数等操作。
  • 空类大小为1。空类,没有成员变量,可以有成员函数,因为成员函数不占用类的内存空间。因为类模拟现实中的抽象概念,类生成的对象模拟现实中的实体,实体是现实中真实存在的东西。所以如果空类不占空间,生成的对象也不占空间,那么一个不占空间的对象可以模拟实体吗,可以做出行为吗?答案肯定是不行的,所以设计者将空类设置为最小值1。

三、C++三大特性

三大特性:

  • 封装
  • 继承
  • 多态

我们今天讲解封装,后面的特性后面讲解。

封装:把属性和行为实现保护起来,通过公共的接口操作属性,通过访问限定符实现。

类默认的访问限定符是私有的, 其他类不允许访问类私有的属性。

故需要给属性和方法给予一定的权限,限制其他类对属性,方法的访问,称为访问限定符,主要有三种:

访问限定符访问位置限制
public任意位置访问
protected只能在子类和本类类中访问
private只能在本类类中访问
  • 使用方式:

    访问限定符:
    	属性/方法  
    
  • 范围:从设置点到开始到下一个访问限定符,或类结束。

四、一个简单类的实现

实现一个简单的类,将现实世界中人进行一个抽象,其属性有:姓名,性别,年龄;行为有:吃饭,学习。那么经过OOP思想后:

  1. 成员变量,设置为私有的:
    char name[10];//姓名
    bool sex;//性别
    int age;//年龄
    
  2. 成员方法,设置为公有的:
    void eat();//吃饭
    void study();//学习
    

那么这个Person类实现起来就很简单,代码如下:

# include<iostream>
class Person
{
public:
	void eat()
	{
		std::cout<<"eating"<<std::endl;
	}
	void study()
	{
		std::cout<<"studing"<<std::endl;
	}
private:
	char name[10];//姓名
    bool sex;//性别
    int age;//年龄

};
int main()
{
	Person p1;//生成对象
	p1.study();//调用函数
	p1.eat();
}

运行结果:
在这里插入图片描述

五、成员变量、成员方法和对象的关系

【一、成员变量和对象的关系】

成员变量对于每个对象是独享的,私有的。

实现独享: 让每个对象拥有自己的空间即可。因为每个对象都是不同独立的个体,都有自己的属性,例如学生类定义张三对象,李四对象它们都有自己的名字,年龄等。

【二、成员方法和对象的关系】

成员方法和对象共享。

实现共享将成员方法放在一块内存中,所有对象都可以指向使用。比如张三会学习,李四也会学习。

那么我们用一张图来表示这三者的关系:

在这里插入图片描述
所以 空类就是是:不存在成员变量,可以存在成员函数,因为成员函数不在类中占用内存空间。

六、this指针

【1. _thiscall调用约定】

规定成员方法调用依赖对象调用。我们知道this指针是const修饰(看了下面就知道了),是常量,表示this指针一定要有数值,一定要接收对象的地址,那就是调用点一定要有对象存在。即对象不得不存在,所以成员方法调用依赖对象调用。

【2. this指针】

程序为什么知道现在是哪个对象在调用成员方法?

根据this指针。this指针指向对象所占的空间此时使用_thiscall调用约定,它是用于类成员方法的调用约定。它规定在调用点隐藏参数this,如:
在这里插入图片描述

  • 系统在调用点系统将对象地址传入,调用buy函数时,this就会解析地址,直接指向good1对象空间, 那么 this指针的类型就是类类型。这样程序就知道是哪个对象在调用成员方法。
  • this指针为什么不可以修改? 原因很简单,如果允许this改变,那么在成员方法中就可以改变this,但是调用点不知道你改变了,这样就会导致调用点以为在操作good1对象,但实际调用方法在操作其他对象。所以在this前面需要加const

加油哦!🥠。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值