封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物。
- 将属性和行为加以权限控制。
在c++中,通常将封装出来的整体叫做 类
例如我们可以设计一个圆类,这个类可以求出圆的周长
#include <iostream>
using namespace std;
const double PI = 3.14;
class Circle //圆类定义
{
public: //公共权限
int c_r; //类的属性
double culcir() //类的行为
{
return 2 * PI * c_r;
}
};
int main()
{
Circle c1; //圆的一个对象声明
cout << "圆的半径为";
cin >> c1.c_r;
cout << "圆的周长为" << c1.culcir() << endl;
return 0;
}
上面的代码中,class代表着一个类,后面紧跟着的是类的名称。
在类中主要包含 访问权限,属性,行为。
其中权限在以后会讲解,属性主要包含类中的的变量,行为就是实现功能的函数
通过类来创建一个具体对象的过程叫做实例化。
对象的中的变量和函数可以通过 "."来访问。
访问权限
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限分为三种:
- public 公共权限 其成员类内可以访问 类外也可以访问
- protected 保护权限 其成员类内可以访问 类外不可以访问
- private 私有权限 其成员类内可以访问 类外不可以访问
保护权限和私有权限的区别主要体现在类的继承上,子类可以访问父类保护权限中的成员,却无法访问父类中私有权限的成员。
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
string name;
protected:
string car;
private:
string passcard;
public:
void SetPerson()
{
name = "张三";
car = "拖拉机";
passcard = "123456";
}
void ShowName()
{
cout << name << endl;
}
private:
void ShowCar()
{
cout << name << endl;
}
private:
void ShowPassCard()
{
cout << passcard << endl;
}
};
int main()
{
Person per;
per.SetPerson();
per.ShowName();
// per.ShowCar(); 保护权限中的成员类外不可以访问
// per.ShowPassCard(); 私有权限中的成员类外不可以访问
per.name = "李四";
per.ShowName();
// per.ShowCar();
// per.ShowPassCard();
return 0;
}
struct和class区别
结构体struct和类class的唯一区别就在于二者的默认访问权限不同
- struct默认权限为公共
- class默认权限为私有
#include <iostream>
using namespace std;
class C //class 中属性的默认作用域为 private 类外不能访问
{
int a;
};
struct S
{
int a; //struct 中元素默认作用域为 public 类外可以访问
};
int main()
{
C c;
S s;
// c.a = 1;
s.a = 1;
return 0;
}
成员属性设置为私有
- 优点1:将所有成员属性设置为私有,可以自己控制读写权限
- 优点2:对于写权限,我们可以检测数据的有效性。
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
string p_name; //控制姓名属性为可读可写
int p_age = 18; //控制年龄属性为只读
string p_idol; //控制偶像属性为只写
public: //通过对私有属性进行公有行为的操作实现控制属性的读写
void SetName(string name)
{
p_name = name;
}
string GetName()
{
return p_name;
}
// void SetAge(int age) //将年龄属性设置为可写
// {
// if(age >= 0 && age <= 150) //对输入属性的值进行检查
// p_age = age;
// }
int GetAge() //一个函数设置属性为只可读
{
return p_age;
}
void SetIdol(string idol) //一个函数设置属性为只可写
{
p_idol = idol;
}
};
int main()
{
Person per;
per.SetName("张三");
// per.SetAge(20);
cout << "姓名" << per.GetName() << endl;
cout << "年龄" << per.GetAge() << endl;
per.SetIdol("蔡徐坤");
return 0;
}