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; 报错 无法获取情人 }