C语言中的封装
struct Person
{
char mName[64];
int mAge;
};
// 因为在C中不能在结构体中声明函数,就只能在外部实现,然后用test01函数中的方法进行封装
void PersonEat(struct Person *p)
{
printf("%s 在吃饭\n",p->mName);
}
void test01()
{
struct Person p1;
strcpy(p1.mName, "德玛西亚");
PersonEat(&p1);
}
C语言封装的缺点是:属性和行为分开处理,类型检测不够,容易把一个结构体的属性传到另一个结构体行为上
struct Dog
{
char dName[64];
int dAge;
};
void DogEat(struct Dog *d)
{
printf("%s 在吃饭\n", d->dName);
}
void test01()
{
struct Dog d1;
strcpy(d1.dName, "旺财");
DogEat(&d1);
struct Person p1;
strcpy(p1.mName, "老王");
DogEat(&p1); //这样就会把“人”的属性传到“狗”的行为当中
}
C++语言中的封装
C++语言封装:将属性和行为作为一个整体来表示生活中的事物
C++中封装的好处 严格类型转换检测,让属性和行为绑定到一起
// C++语言中的封装
struct Person
{
char mName[64];
int mAge;
void PersonEat()
{
cout << mName << "在吃饭" << endl;
}
};
struct Dog
{
char dName[64];
int dAge;
void DogEat()
{
cout << dName << "在狗粮" << endl;
}
};
void test01()
{
Person p1;
strcpy(p1.mName, "老王");
//p1.DogEat(); // 这样就不行了,因为DogEat不是Person里面的方法
}
// C++中封装的好处 严格类型转换检测,让属性和行为绑定到一起
// 也就是说将属性和行为作为一个整体来表示生活中的事物
C++中封装的第二层概念就是控制权限:
在class类中,如果不声明权限,默认的权限是private,但在struct中,默认的权限是public,这是struct和class的唯一不同
- public公有权限:公有成员在类内部和类外部都可以访问
- protected保护权限:在类内部可以访问,类外部不可以访问,当前类的子类可以访问
- private私有权限:私有成员(属性、方法函数) 在类内部可以访问,类外部不可以访问,子类也不可以访问
建议成员属性都设置为私有的
通过给成员属性设置为私有权限后,可以设置它们的读写权限,类外部可以提供公共的对外接口进行访问,如用set和get进行设置和获取
class Person
{
public:
//因为私有变量不能在类外访问,因此可以在类内用函数进行设置
// 获取年龄,读权限
int getAge()
{
return mAge;
}
//读姓名
string getName()
{
return m_Name;
}
//写姓名
void setName(string name)
{
m_Name = name;
}
//写
void setLover(string lover)
{
m_lover = lover;
}
private:
int mAge = 0; //只读
string m_Name; //读写
string m_lover; //只写
};