类和对象_封装
C++面对对象的三大特征为:封装、继承、多态
C++认为万事万物皆为对象,对象上有其属性和行为
封装的意义
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装意义一:
在设计的时候,属性和行为写在一起,表现事物
语法: class 类名 {访问权限:属性/行为};
//实例1:设计一个圆类,求圆的周长 #include <iostream> using namespace std; //圆的周长公式:2 * PI * 半径 const double PI = 3.14; 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; 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; public: void func() { m_Name = "张三"; m_Car = "拖拉机"; m_Password = 123456; } }; int main() { Person p1; p1.m_Name = "李四"; p1.func(); //p1.m_Car = "奔驰"; 报错 protected类外无法访问 //p1.m_Password = 654321; 报错 private 类外无法访问 }
struct和class的区别
在C++中struct和class唯一的区别就在于默认的访问权限不同
区别:
- struct默认权限为公共
- class默认权限为私有
#include <iostream> #include <string> using namespace std; class C1 { int m_A;// 默认权限 是私有 }; struct C2 { int m_A;// 默认权限 是公共 }; int main() { C1 c1; //c1.m_A = 100; 报错 不可访问 C2 c2; c2.m_A = 100; //可以访问 }
成员属性设置为私有
优点1:将所属成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
#include <iostream> #include <string> using namespace std; class Person { public: //设置姓名 void setName(string name) { m_Name = name; } //获取姓名 string getName() { return m_Name; } //获取年龄 如果想修改(年龄的范围必须是0 - 150之间) int getAge() { return m_Age; } void setAge(int age) { m_Age = 0; //初始化年龄为0 if (age < 0 || age > 150) { cout << "输入的年龄有误" << endl; return; } else m_Age = age; } //设置情人 void setLover(string lover) { m_Lover = lover; } private: //姓名 可读可写 string m_Name; //年龄 可读可写 int m_Age; //情人 只写 string m_Lover; }; int main() { Person p; p.setName("张三"); cout << "姓名为:" << p.getName() << endl; //p.m_Age = 18; 报错 无法直接设置 p.setAge(151); cout << "年龄为:" << p.getAge() << endl; p.setLover("233");//写入情人 //cout << "情人为:" << p.m_Lover << endl; 报错 无法获取情人 }
设计案例:圆和圆上的点
#include <iostream> using namespace std; //点类 class Point { public: //行为 设置点 获取点 void setPoint(int x, int y) { m_X = x; m_Y = y; } int getX() { return m_X; } int getY() { return m_Y; } //属性 x和y private: int m_X; int m_Y; }; //圆类 class Circle { public: //设置半径 void setR(int r) { m_R = r; } //获取半径 int getR() { return m_R; } //设置圆心 void setCenter(Point center) { m_Center = center; } //获取圆心 Point getCenter() { return m_Center; } private: //属性 半径和圆心 int m_R; Point m_Center; }; //全局函数 判断点和圆的关系 void isInCircle(Circle &c, Point &p) { //圆心到点的距离 的平方 int distance = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY()); //半径 的平方 int rDistance = c.getR() * c.getR(); if (distance == rDistance) { cout << "点在圆上" << endl; } else if (distance > rDistance) { cout << "点在圆外" << endl; } else { cout << "点在圆内" << endl; } } int main() { //创建圆的实例对象 Circle c; c.setR(10);//设置圆的半径为10 Point center;//创建点对的实例象(圆心) center.setPoint(10, 0);//设置点坐标 c.setCenter(center);//令该点为圆心 //创建点的实例对象 Point p; p.setPoint(10, 11); //设置点坐标 isInCircle(c, p);//判断点和圆的关系 }

浙公网安备 33010602011771号