C++学习(8)—— 封装
C++面向对象的三大特性:封装、继承、多态
C++认为万事万物都可以为对象,对象上有其属性和行为
具有相同性质的对象,可以抽象为类
1. 封装的意义
封装是C++面向对象三大特性之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以控制
- 封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{访问权限:属性 / 行为};
示例1:设计一个圆类,求圆的周长
#include<iostream>
using namespace std;
//圆周率
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2*PI*半径
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;
}
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
#include<iostream>
#include<string>
using namespace std;
class Student{
//访问权限
public:
string s_name;
string s_id;
void showStudent(){
cout << "姓名:" << s_name << "\n学号:" << s_id << endl;
}
void setName(string name){
s_name = name;
}
};
int main(){
//实例化对象
Student s1;
//s1.s_name = "张三";
s1.setName("张三");
s1.s_id = "001";
s1.showStudent();
Student s2;
s2.s_name = "李四";
s2.s_id = "002";
s2.showStudent();
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.m_car = "宝马";
//p1.m_Password = 123;
return 0;
}
2. 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 = 200;
return 0;
}
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;
}
//读年龄
int getAge(){
return m_Age;
}
//写年龄————————有效性验证
void setAge(int age){
if(age < 0 || age > 150){
cout << "年龄范围错误" << endl;
return ;
}
m_Age = age;
}
//写爱人
void setLover(string name){
m_Lover = "NoBody";
}
private:
string m_Name; //姓名 可读可写
int m_Age = 20; //可读可写,但范围必须在0~150之间
string m_Lover; //只写
};
int main(){
Person p;
p.setName("张三");
cout << "姓名为:" << p.getName() << endl;
return 0;
}
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.