为什么引入类
在这之前,先思考以下问题:
- 为什么要引入数组?
同一类型的变量太多了 - 为什么要引入函数?
结构化程序设计:功能分解,代码重用 - 为什么要引入指针?
加快速度、参数传递、动态分配内存 - 为什么要引入结构体?
复合数据结构,不同数据类型的聚合在一起
类:
- 采用人们认识客观世界的自然方式去模拟客观世界中对象。
将客观世界中的实体完整性的描述(即数字化) - 提高开发程序的效率和可靠性
数据与代码的聚合(以便更高级的代码复用)
面向过程程序设计和 面向对象程序设计
- 面向过程程序设计(Structured Programming)
1,以功能为中心,通过分解功能,采用函数来描述操作,使用不同的函数来完成不同的子功能,之后相互调用,完成任务;
2,数据与函数分离,数据(类型或结构)一旦发生改变,函数也要相应改变 - 面向对象程序设计(Object Oriented Programming)(也称OOP)
1,以数据为中心,采用对象来描述内部属性和操作方法
2,将数据和函数当作一个统一体,采用软件对象模拟客观世界中实际对象
类的基本概念
成员
类的成员包括公有成员public、私有成员private、保护成员protected
在每个类型的成员中又可以定义数据成员、函数成员
一般类的函数成员定义为公有成员
公有成员public
类的公有成员用public声明,在类外可以直接通过运算符“.”来访问。
- 一般函数成员被定义为公有成员;
- 在公有成员中的函数成员中可以访问类的私有、保护成员中的数据成员
- 通过调用公有函数成员实施规定的操作
- 外界与类之间起着接口的作用
私有成员private
外界(类外)不能够直接访问该成员
- 一般数据成员被定义为私有成员
- 使得成员被封装隐藏起来,外界不能随便修改对象的私有数据成员
- 只有通过类中公有函数对数据进行修改,达到数据的安全性
保护成员protected
外界部分区域能够访问该成员。换句话说,某些数据或函数成员在类外可以被有限制的访问。
#include <iostream>
using namespace std;
class Date//定义一个日期date类
{
public:
int year,month;//将年、月定义为public共有成员
void setdate(int _year,int _month,int _day)//在public中又定义了一个函数,可以用于给对象赋值
{
year=_year;
month=_month;
day=_day; //注意,在同一个类中,可以通过public中的函数,访问、修改private成员
}
void showdate()//定义了一个打印日期的public成员函数
{
printf("%d年%d月%d号",year,month,day);
}
private:
int day;//将日期定义为私有private成员
};
int main()
{
Date temp;//创建了一个Date类的对象temp
temp.setdate(2021,1,13);//使用"."运算法调用Date类的setdate函数,对temp中的对象进行赋值
temp.showdate();//使用"."运算法调用Date类的showdate函数,打印日期
return 0;
}
//运行结果:
2021年1月13号
实例分析
在上述事例中,定义了一个类Date,在类中定义了public、private成员,在public中可以访问、修改private、protected成员中的数据。
三者区别:
私有是对外界完全封闭,公有是完全开放,保护是介于两者之间
稍微进阶
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
class Fraction//定义一个分数类
{
private:
int down;//将分母定义为私有成员
public:
int up;//将分子up定义为公有成员
void setdata(int a,int b)//在Fracion类中定义了一个setdata函数,
{ //用于给对象赋值
up = a; //注意:在同一个类中,公有成员中的函数可以访问、修改私有成员
down = b;
}
void showdown()//定义了一个打印函数showdown,用于打印对象的分母。
{
cout<<down;
}
};
class real:public Fraction//定义了一个real实数类,且继承了Fraction类的公有和保护成员
{
public:
void showdata()//定义了一个公有成员,为一个函数,用于打印分母;
{
cout<<down;
}
};
int main()
{
real r;//定义了一个real实数类的对象r
r.setdata(4,5);//调用继承的Fraction类中的setdata成员,为对象赋值
r.showdata();//使用real类中的公有成员showdata,输出对象r的分子
return 0;
}
上述实例中,定义了一个分数Fractiion类、一个实数real类,并且real继承了Fraction类的public、protected成员。
在real中定义了一个打印函数,放在了real的public中,企图打印出来对象的分母,但是在Fraction类中,分母被定义为了一个private成员,是Fraction类的私有成员,是不能被继承的,所以会报错。
C:\Users\xxx\Desktop\C++\temp\main.cpp|9|error: ‘int Fraction::down’ is private
提示down是私有的成员,不可被访问,没有继承给real类