C/C++语言基础--C++面向对象、类、对象概念讲解
本专栏目的
- 更新C/C++的基础语法,包括C++的一些新特性
前言
- 今天更新的比较晚了,主要一直用是谷歌Colab训练模型,访问国内csdn反而不好使了,请大家见谅;
- C++是面向对象的语言,本文将介绍什么是面向对象、什么是类、什么是对象、类和对象的关系是什么?
- 欢迎大家点赞 + 收藏 + 关注;
- C语言后面也会继续更新知识点,如内联汇编;
- 本人现在正在写一个C语言的图书管理系统,1000多行代码,包含之前所学的所有知识点,包括链表和顺序表等数据结构,请大家耐心等待!!
类和对象
面向对象
概念
定义:面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
上面是官方的定义,对于初学的你,初次看是否能理解呢?如果能理解,那面向过程和面向对象区别能否举个例子呢?
- 看不没有关系,面向对象会伴随程序员一生,每个阶段的理解都会不同
- 对于面向对象和面向过程的区别,我感觉一个经典的案例可以说明这件事情:如何把大象关机冰箱🤠
- 对于面向过程:面向过程就是把每一步想好,然后一步一步照做,比如说把大象关机冰箱,
可以分为3步,第一步,打开冰箱门;第二步,把大象关进冰箱;第三步,关闭冰箱门。
(当然,也可以分为4步、5步),面向过程就是这样,想好每一步的过程,然后按照步骤分别执行。 - 对于面向对象:在面向对象中有一句话,
万物皆对象
,对象是现实世界的理解和抽象,如果用面向对象来理解把大象关机冰箱,首先,需要明白这个过程有几个对象,很明显,这里有两个对象,大象与冰箱;其次,需要分别对大象和冰箱做考虑,很明显,对于大象来说,只有一个动作
,就是把大象关进冰箱门,对于冰箱来说,有打开和冰箱门两个动作
;接下来,每个动作在面向对象有一个专有名词叫做方法;最后,就是按照常见,对方法进行排列组合,:happy:
- 对于面向过程:面向过程就是把每一步想好,然后一步一步照做,比如说把大象关机冰箱,
类和对象
什么是类?
类,即类别:类是具有相似属性和行为的一组实例集合,比如说:
- 世界上所有人都有一个相似的东西,那就我们都是人类,简称人,:happy:,所以人也可以抽象成一个类;
- 对于长方形、圆、正方形……来说,他们都抽象成平面几何,他们都有共同的特性,就是有面积…………
以上两点看起来很**”无语“**,但是这就是面向对象的思想案例,就像是我们说的一切复杂的东西本质都是简单的。
从百度copy了两张图片,如下:
什么是对象?
一个具体东西,是一个对象的实例,就像人是一个对象,但是我是一个类,你也是一个类,他也是
四大特性
面向对象主要有四大特征:抽象、封装、继承、多态。
1、抽象(abstract)
抽象是将类对象的共同特征总结、提取出来构造类的过程,只关注对象的哪些属性和行为,并不关注这此行为的细节是什么。
属性抽象:表示世界中一类事物的特征,就是对象的属性。比如鸟有翅膀,羽毛等(类的属性)
行为抽象:表示世界中一类事物的行为,就是对象的行为。比如鸟会飞,会叫(类的方法)
2、封装(encapsulation )
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口,,隐藏了实现细节,比如说封装一个对数组的遍历:
void foreach(int a[], int n)
{
for(int i = 0; i < b; i++) {
std::cout << i << " ";
}
std::endl;
}
//举例
int main()
{
int a[] = {1, 2, 3, 4, 5};
foreach(a, sizeof(a) / sizeof(a[0])); // 这个时候会帮你遍历,会输出数组里面的内容
}
/*
* 输出:
* 1 2 3 4 5
*
封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。
3、继承(inheritance)
继承是从已有类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,提高了代码的复用率。
4、多态(Polymorhism)
多态是指允许不同类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。
动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接。
总结
在实践中体会,光看概念始终只会停留在表面。
类的创建和对象的实例化
类的创建和C语言中的结构体类似,只不过关键变成了class,当然其实也是可以使用struct的。
类中除了可以定义成员变量(属性)之外,还可以定义成员函数(方法),类还可以设置访问权限,可以控制类中的成员在何处能访问。
三个访问权限限定符:用来设置成员变量和成员函数的访问属性。
- public:公有成员,它们允许被本类或其它类的成员函数(通过对象)访问或调用,是类的外部接口,成员函数一般定义为public属性;
- private:私有成员,它们只允许被本类的成员函数访问,数据成员一般定义为private属性;
- protected:保护成员,它们允许被本类的成员函数和派生类的成员函数访问或调用。
示例
- private:只能在内部访问,如下面:
class Student
{
public:
void setMess(std::string name, int age)
{
this->m_name = name;
this->m_age = age;
}
std::string getName()
{
return this->m_name;
}
int getAge()
{
return this->m_age;
}
private:
std::string m_name;
int m_age;
};
这个时候在外部访问,会出现访问不到的现象,如下:
如果需要访问,则需要在类中定义接口,如:getName,getAge,通过接口返回值访问,如下:
- public: 可以在外部访问
class Student
{
public:
void setMess(std::string name, int age)
{
this->m_name = name;
this->m_age = age;
}
private:
std::string m_name;
int m_age;
};
可以直接访问:
成员函数命名规则
- 在每个成员变量前加 m_
- 在每个成员变量后加_
class Animal
{
private:
int m_age{0};
public:
//可以通过共有的函数来访问私有成员
void print()
{
cout << "age:" << m_age;
}
}
class和struct的区别
前面说道class也是可以用struct替代的,那么他们两个之间有什么区别吗?
区别只有一个:struct定义的类属性是默认公有的,而calss定义的类属性是私有的.
类的定义和成员函数定义分离
一般将类的定义放在头文件(.h) 中,类的实现放在源文件(.cpp) 中,而main主函数可以放在另一个源文件中。
何谓分离?即把函数的定义放在类的外部实现!这种操作提高了代码的耦合性,更好维护。
成员函数的定义方式与其他函数的定义方式基本相同,但必须在成员函数名前面加上类名和作用域限定符(简称域运算符)