文章目录
一、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思想后:
- 成员变量,设置为私有的:
char name[10];//姓名 bool sex;//性别 int age;//年龄
- 成员方法,设置为公有的:
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。
加油哦!🥠。