目录
类的封装
现实世界的事物都具有自己的行为和属性,如果我们将其属性和行为表示出来,那么就可以抽象这个事物。
C语言下封装的缺陷
而在C语言中,因为struct仅仅能定义成员变量,而不能定义函数。这就意味着属性和行为是分开的。这时会发生一些错误,见如下代码实例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Person
{
char mName[64];
int mAge;
};
void PersonEat(struct Person* p)
{
printf("%s 在吃饭\n",p->mName);
}
void test01()
{
struct Person p1;
strcpy(p1.mName, "德玛西亚");
PersonEat(&p1);
}
struct Dog
{
char dName[64];
int dAge;
};
void DogEat(struct Dog* p)
{
printf("%s 在吃狗粮\n", p->dName);
}
void test02()
{
struct Dog d;
strcpy(d.dName, "旺财");
DogEat(&d);
struct Person p1;
strcpy(p1.mName, "老王");
DogEat(&p1);; //这会弹出老王在吃狗粮,发生了强制转换。
}
//c语言封装,属性和行为分开处理,类型检测并不严格,导致老王吃狗粮
int main()
{
test02();
return 0;
}
由C上述实例可知,属性和行为分开的C会由于强转发生错误。
C++中的封装
而在C++中,属性和行为合成了一个整体,也就变量和函数封装为一体,并提供了访问权限函数。具体如下:
封装
- 把变量(属性)和函数(行为)合成一个整体,封装在一个类中。
- 对变量和函数行访问控制。
访问控制
注:C++中,class默认访问权限为private,struct默认访问权限为public。
- 在类内部,没有访问权限之分,所有成员互相访问。
- 在类外部,才有访问权限:public,private,protecded。
- 在类外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,private和protected是同等级的,外部不允许访问。
#define _CRI_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
struct Person
{
char mName[64];
int mAge;
void PersonEat()
{
cout <<mName<< "吃人饭" << endl;
}
};
struct Dog
{
char mName[64];
int mAge;
void DogEat()
{
cout << mName << "吃狗粮" << endl;
}
};
//C++中的封装 严格的类型转换检测,让属性和行为绑定再来一起
//属性和行为作为一个整体来表示生活中的事物
//控制权限:public 公有权限protected 保护权限 private 私有权
void test01()
{
Person p1;
strcpy(p1.mName, "老王");
p1.PersonEat();
// p1.DogEat(); 报错DogEat不是person的成员
}
class Animal
{
//如果我不声明权限,默认的权限是private
void eat();
public:
int mHeight;
protected: //保护权限,类内部可以访问,(当前子类可以访问),类外部不能访问
int mWeight;
};
//所谓私有权限 就是私有成员在类内部可以访问,类外部不能访问
//公共权限,在类内部和类外都可以访问
void test02()
{
Animal an;
//an.eat(); 私有权限,报错
an.mHeight = 100;
cout << "身高" << an.mHeight << endl;
}
int main()
{
test01();
return 0;
}
建议将成员变量设置为private
如果成员变量不是public,客户端唯一能够访问对象的方法就是通过成员函数。如果类中所有public权限的成员都是函数,客户在访问类成员时只会默认访问函数。
使用成员函数可以使得我们对变量的控制处理更加精细。
class AccessLevels{
public:
//对只读属性进行只读访问
int getReadOnly(){ return readOnly; }
//对读写属性进行读写访问
void setReadWrite(int val){ readWrite = val; }
int getReadWrite(){ return readWrite; }
//对只写属性进行只写访问
void setWriteOnly(int val){ writeOnly = val; }
private:
int readOnly; //对外只读访问
int noAccess; //外部不可访问
int readWrite; //读写访问
int writeOnly; //只写访问
};
版权声明:本文为ouyangyiwen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。