七. C/C++的封装及私有成员

目录

类的封装

C语言下封装的缺陷

C++中的封装

建议将成员变量设置为private


类的封装

现实世界的事物都具有自己的行为和属性,如果我们将其属性和行为表示出来,那么就可以抽象这个事物。

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++中,属性和行为合成了一个整体,也就变量和函数封装为一体,并提供了访问权限函数。具体如下:

封装

  1.  把变量(属性)和函数(行为)合成一个整体,封装在一个类中。
  2. 对变量和函数行访问控制。

访问控制

注:C++中,class默认访问权限为private,struct默认访问权限为public。

  1.  在类内部,没有访问权限之分,所有成员互相访问。
  2. 在类外部,才有访问权限:public,private,protecded。
  3. 在类外部,只有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版权协议,转载请附上原文出处链接和本声明。