【C++】带你一篇了解什么是OPP(面向对象编程),什么是封装?类和对象(上)
代码语言:javascriptAI代码解释// 类体:由成员函数和成员变量组成// 一定要注意后面的分号class是定义一个类的关键字,classname是类名,{}中是类的主体,注意类的定义后有分号。类中的元素称为类的成员:类中的数据又叫类的属性/类的成员变量、类的函数又叫做类的方法/类的成员函数。代码语言:javascriptAI代码解释public:_age = age;如果成员函数在类中定
面向对象编程和面向过程编程
举下面这个例子能够更形象展示OPP与面向过程性编程的区别:
此举例改变自《C++ Primer Plus(第六版)》: 曼联足球俱乐部的一名新成员被要求记录球队的统计数据。很自然他会借助计算机来完成这项任务。 如果这个新成员是过程性程序员,可能会这样考虑: 我要输入每名运动员的姓名,进球数,助攻数,登场数等其他重要的基本统计数据。之所以使用计算机,是为了简化统计工作,因此让他来计算某些数据。另外,我还希望程序能够显示这些结果。应该如何组织呢?我让main()调用一个函数来获取输入,调用另外一个函数来进行计算,然后调用第三个函数来显示结果。那么,获得下一场比赛的数据后,又改怎么做呢?当然不想从头开始,可以添加一个函数来更新统计数据。可能需要在main函数中添加一个菜单,选择是输入,计算,更新还是显示数据等。则如何表示这些数据呢。可以使用一个字符串来存储选手的姓名,用另外一个数组来存储每位球员的进球数,再用一个数组存储助攻数等等。这种方法太不灵活了。因此可以设计一个结构体来存储每位球员的所有信息,然后用这种结构组成的数组来表示整个球队。 总之,采用过程性编程时,首先要考虑遵守的步骤,然后考虑如何表示这些数据。 如果换成一个OOP程序员,又将如何考虑呢? 首先要考虑数据——不仅要考虑如何表示数据,还要考虑如何使用数据: OOP程序员会想,我要跟踪的是什么?当然是球员。因此要有一个对象表示整个球员的各个方面(不仅仅是进球数或助攻数)。因此这将是基本数据单元——一个表示球员的姓名和统计数据的对象。我需要一些处理该对象的方法。首先需要一种将基本信息加入到该单元中的方法;其次,计算机应计算一些东西,如进球率。因此要添加一些执行计算的方法。程序应自动完成这些计算,而无需用户的干扰。另外,还需要一些更新和显示信息的方法。所以,用户与数据交互的方式有三种:初始化,更新和报告——这就是用户接口。 总之,采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述之后,需要确定如何实现接口和最后,使用寻得设计方案创建出程序。
3. 类的引入
在面向过程化编程中,我们通常使用结构体来描述对象(以C语言为例)。在C语言中,结构体中只能定义变量,但是在C++中,结构体中也可以定义函数:
代码语言:javascript
AI代码解释
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
但是在C++中,我们更喜欢使用Class来代替。
4. 类的定义
代码语言:javascript
AI代码解释
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
- class是定义一个类的关键字,classname是类名,{}中是类的主体,注意类的定义后有分号。
- 类中的元素称为类的成员:类中的数据又叫类的属性/类的成员变量、类的函数又叫做类的方法/类的成员函数。
4.1 类的两种定义方式
4.1.1 类的声明和定义全部放在类体中
代码语言:javascript
AI代码解释
class Student
{
public:
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
public:
char _name[20];
char _gender[3];
int _age;
};
注意:如果成员函数在类中定义, 编译器有可能会将其当成内联函数处理。
更多推荐



所有评论(0)