封装
封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。
C语言中的封装
#include <stdio.h>
struct Person {
char name[64];
int age;
};
void PersonEat(struct Person* p)
{
printf("%s在吃人饭\n", p->name);
}
struct Dog {
char name[64];
int age;
};
void DogEat(struct Dog* dog)
{
printf("%s在吃狗粮\n", dog->name);
}
int main() {
//设置Person
struct Person p;
strcpy(p.name, "张三");
p.age = 10;
//调用PersonEat方法
PersonEat(&p);
//设置Dog
struct Dog d;
strcpy(d.name, "旺财");
d.age = 100;
//调用DogEat方法
DogEat(&d);
//调用DogEat方法传入Person,虽然方法要求传入的是struct Dog * 类型的指针,但传入struct Person* 类型的也可以正常执行
DogEat(&p);
}
由此可以看出,C语言的封装,只是对属性进行了封装,并不能封装行为。Person对象也可以调用Dog的函数,属于不完全的封装。
C语言中的结构体不允许定义函数
注意:
DogEat方法要求传入的是
struct Dog *
类型的指针,但传入struct Person*
类型的也可以正常执行。原因在于指针的类型仅仅代表指针的步长,类型不同仅能说明指针的步长不同。
C++的封装
C++ 通过创建类(class)
或结构体(class)
来支持封装和数据隐藏(public、protected、private)。我们已经知道,类包含私有成员(private)、保护成员(protected)和公有成员(public)成员。
- 类中定义的所有成员默认都是私有的
- 结构体中所有的成员默认都是公有的
- 除了访问权限不同,
struct
和class
并无本质差别 - 实现了成员属性、成员方法的封装及访问权限的控制
封装的效果
- 将属性和行为作为一个整体,来表现生活中的事物
- 将属性和行为 加以权限控制
struct Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
总结:struct
和class
区别?
class
默认(不写明权限关键字)权限为私有权限,而 struct
默认权限是公共权限。
访问权限
- public 公共权限 : 成员变量及成员方法 类内和类外 都可以访问
- private 私有权限 : 成员变量及成员方法 类内可以访问 , 类外 不可以访问 ,子类不可以访问父类的private权限内容
- protected 保护权限: 成员变量及成员方法 类内可以访问 , 类外不可以访问, 子类可以访问父亲的protected权限内容
#include <iostream>
using namespace std;
struct Person
{
//公共权限
public:
char name[64];
int age;
void PersonEat()
{
printf("%s在吃人饭\n", name);
}
};
struct Dog
{
//公共权限
public:
char name[64];
int age;
void DogEat()
{
printf("%s在吃狗粮\n", name);
}
};
void test01()
{
struct Person p;
strcpy(p.name, "老王");
p.PersonEat();
//p.DogEat();
}
class Person2
{
public:
string m_Name; //公共权限
protected:
string m_Car; //保护权限
private:
int m_pwd; //私有权限
public:
void func()
{
m_Name = "张三";
m_Car = "拖拉机";
m_pwd = 123456;
}
};
void test02()
{
Person2 p;
p.m_Name = "李四"; //公共权限 类外可以访问
// p.m_Car = "劳斯莱斯"; //保护权限 类外访问不到
// p.m_pwd = 123; //私有权限 类外不可以访问
}
int main() {
test01();
system("pause");
return EXIT_SUCCESS;
}