C++ 类的封装
原创
©著作权归作者所有:来自51CTO博客作者wx6296d048c716d的原创作品,请联系作者获取转载授权,否则将追究法律责任
使用构造体构造一个Date
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
//初始化这个结构体
void init_date(struct Date& date)
{
cout << "year, month, day" << endl;
cin >> date.year;
cin >> date.month;
cin >> date.day;
}
//打印此结构体
void print_data(struct Date& date)
{
cout << "日期是" << date.year << "年" << date.month << "月" << date.day << "日" << endl;
}
//判断是否为闰年
bool is_leap_year(struct Date& date)
{
if (((date.year % 4 == 0) && (date.year % 100 != 0)) || (date.year % 400 == 0)) {
return true;
}
else {
return false;
}
}
int main(void)
{
Date dl;
init_date(dl);
print_data(dl);
if (is_leap_year(dl) == true) {
cout << "是闰年" << endl;
}
else {
cout << "不是闰年" << endl;
}
return 0;
}
通过class对以上构造体Date代码重构
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class MyDate
{
public://访问控制权限 //在public标识符下面定义的成员变量和成员函数 均可以在类的外部和类的内部 访问
int get_year()
{
return year;
}
void set_year(int new_year) {
year = new_year;
}
void init_date() { // 成员方法
cout << "year, month, day" << endl;
cin >> year;
cin >> month;
cin >> day;
}
//成员函数
bool is_leap_year()
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
return true;
}
else {
return false;
}
}
void print_date() {
cout << "日期是" << year << "年" << month << "月" << day << "日" << endl;
}
protected://在类的继承中跟private有区别,如果是单个类, 跟private是一样的, 在类的内部能够访问,在类的外部不能够访问
private://在private 访问控制符 下定义的成员变量和成员函数 只能在类的内部访问
int month;
int day;
int year;
};
int main(void)
{
MyDate date; //通过MyDate 类 实例化一个对象
//c++中 是面向对象进行开发,所有方法都封装在类中, 通过一个一个的对象进行编程。
date.init_date();
if (date.is_leap_year() == true) {
cout << "是闰年" << endl;
}
else {
cout << "不是闰年" << endl;
}
date.print_date();
// 在类中可以设置getter,setter方法,为外部提供的类或函数提供访问或修改private修饰的属性的值
cout << "修改前:" << date.get_year() << endl;
date.set_year(2020);
cout << "修改后:" << date.get_year() << endl;
}
访问属性
| 属性
| 对象内部
| 对象外部
|
public
| 公有
| 可访问
| 可访问
|
protected
| 保护
| 可访问
| 不可访问
|
private
| 私有
| 可访问
| 不可访问
|
注:truct 中所有行为和属性都是 public 的(默认)。C++中的 class 可以指定行 为和属性的访问方式。 封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。达到了信息隐蔽的功能。
在类中可以设置getter,setter方法,为外部提供的类或函数提供访问或修改private修饰的属性的值
private://在private 访问控制符 下定义的成员变量和成员函数 只能在类的内部访问
int month;
int day;
int year;
public:
int get_year(){
return year;
}
void set_year(int new_year) {
year = new_year;
}
cout << "修改前:" << date.get_year() << endl;
date.set_year(2020); // 通过类中提供的方法,对私有属性的值进行修改
cout << "修改后:" << date.get_year() << endl;
封装有2层含义(把属性和方法进行封装 对属性和方法进行访问控制)
- Public修饰成员变量和成员函数可以在类的内部和类的外部被访问。
- Private修饰成员变量和成员函数只能在类的内部被访问。
struct 的内部默认访问权限和 class的内部默认访问权限
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class VVcat {
int year;
};
// 一个结构体默认的访问控制权限的是public
struct VVcat2 {
int year;
void print() {
}
};
int main(void)
{
VVcat v;
// 无法通过v.属性名,访问类中的默认的private属性
VVcat2 v2;
v2.year = 6;
cout << v2.year << endl;
}
面向对象有三大特点:封装,继承,多态
- 类的{}中的所有区域称为 类的 内部, 除了{ }区域以外都是 类的外部
- C++将struct 做了功能的增强,struct实际上就是一个class
- struct的类的内部,默认的访问控制权限是public
- class 的类的内部,默认的访问控制权限是private