C++面向对象的三大特性:封装、继承、多态
C++认为万事万物皆为对象,对象上有其 属性 和 行为
例如:
人可以是对象,属性有姓名、身高....行为有唱、跳、rap、篮球...
车可以是对象,属性有车轮、车灯....行为有载人、放音乐...
具有相同性质(属性)的对象,我们可以抽象为类,人属于人类,车属于车类。
4.1 封装
4.1.1 封装的意义
1、将属性和行为作为一个整体,表现生活中的事物
2、将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限:属性 / 行为 };
#include <iostream>
#include <string>
using namespace std;
// 设计一个圆类,求圆的周长PI*2r
const double PI = 3.14159;
// class代表设计一个类,后面跟的就是类名
class circle
{
// 访问权限
public:// 表示公共权限,使得类的属性和行为在类内外都能被访问
// 属性(一般是变量)
int m_r; //半径
// 行为(通常是用函数来代表它)
// 获取圆的周长
double calculateZC()
{
return 2 * PI *m_r;
}
};
int main()
{
// 通过 圆类 创建具体的圆(对象)
// 实例化(通过一个 类 创建一个对象的过程)
circle c1;
// 给圆对象的属性进行赋值
c1.m_r = 10;
cout << "圆的周长为:" << c1.calculateZC() << endl; // 通过类的行为获得圆的周长
system("pause");
return 0;
}
运行结果:
#include <iostream>
#include <string>
using namespace std;
// 设计一个学生类,属性有姓名和学号
// 可以给姓名和学号赋值,可以显示学生的姓名和学号
// 设计学生类
class student
{
public:
// 属性
string m_Name;
int m_ID;
// 行为
// 显示姓名和学号
void showStudent()
{
cout << " 姓名:" << m_Name << " 学号:" << m_ID << endl;
}
// 还可以通过类里面的行为给属性赋值
void setName_ID(string name, int ID)
{
m_Name = name;
m_ID = ID;
}
};
int main()
{
// 1、创建一个具体的学生-->实例化对象
student s1;
// 2、给s1对象进行赋值操作
s1.m_Name = " 张三 ";
s1.m_ID = 7229;
// 3、显示学生信息
s1.showStudent();
student s2;
s2.m_Name = " 李四 ";
s2.m_ID = 7228;
s2.showStudent();
// 除了上面给对象赋值的操作,还可以通过在类里面的行为给对象赋值
student s3;
s3.setName_ID(" 王五 ", 7227);
s3.showStudent();
system("pause");
return 0;
}
运行结果:
再介绍几个专业术语:
类中的属性和行为都叫 成员;
属性: 成员属性 或 成员变量
行为: 成员函数 或 成员方法
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制。
访问权限有三种:
- public 公共权限
- protected 保护权限
- private 私有权限
#include <iostream>
#include <string>
using namespace std;
// 访问权限(三种)
// 公共权限 public 成员 类内可以访问,类外可以访问
// 保护权限 protected 成员 类内可以访问,类外不可以访问(儿子可以访问父亲中的保护内容)
// 私有权限 private 成员 类内可以访问,类外不可以访问(儿子不可以访问父亲的私有内容)
class person
{
public:
string m_Name;
protected:
string m_Car;
private:
int m_Password;
private:
void func()
{
m_Name = " 张三 "; // 在类内中这三种权限下的成员变量都可以被访问
m_Car = " Benz ";
m_Password = 123456;
}
};
int main()
{
person father;
father.m_Name = "李四"; // 公共权限下的成员变量可以在类外访问
// father.m_Car = "BYD"; // 此操作非法,因为保护权限下的成员变量不可以在类外访问
// father.m_Password = 123; // 此操作非法,因为私有权限下的成员变量不可以在类外访问
// father.func(); // 此操作非法,因为私有权限下的成员方法不可以在类外访问
system("pause");
return 0;
}
4.1.2 struct和class的区别
在C++中struct和class唯一的区别就是 默认的访问权限不同
也就是说在C++中struct和class很相近,都可以表现一个类。如果你不想用class创建一个类,可以用struct去创建一个类(但要注意区别---默认权限不同)。
区别:
- struct 默认权限为公共
- class 默认权限为私有
#include <iostream>
#include <string>
using namespace std;
// struct 和 class 的区别
class C1
{
int m_A; // 默认权限为 私有
};
struct C2
{
int m_A; // 默认权限为 公共
};
int main()
{
C1 c1;
// c1.m_A = 100; // 此操作非法,因为class类的默认权限为私有
C2 c2;
c2.m_A = 100; // struct类的默认权限为公共
system("pause");
return 0;
}
4.1.3 成员属性设置为私有
优点1:可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
#include <iostream>
#include <string>
using namespace std;
// 成员属性设置为私有
class Person
{
public:
void setName(string name) // 控制成员的 写权限
{
m_Name = name;
}
string getName() // 控制成员的 读权限
{
return m_Name;
}
void setAge(int age) // 控制成员的 写权限
{
if (age < 0 || age>150) // 优点2:对于写权限,我们可以检测数据的有效性
{
m_Age = 0;
cout << "我一眼就能看出你不是人" << endl;
return; // 若return不带返回值且应用于void函数,就相当于break
}
m_Age = age;
}
int getAge() // 控制成员的 读权限
{
return m_Age;
}
private: // 如何访问这些数据?那就需要对外提供一些接口(用public来做)
string m_Name;
int m_Age;
};
int main()
{
Person P8;
P8.setName(" Benz ");
cout << P8.getName() << endl;
P8.setAge(1000);
cout << P8.getAge() << endl;
system("pause");
return 0;
}
运行结果: