C++封装及访问权限浅析

封装

封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。

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)成员。

  1. 中定义的所有成员默认都是私有
  2. 结构体中所有的成员默认都是公有的
  3. 除了访问权限不同,structclass并无本质差别
  4. 实现了成员属性、成员方法的封装及访问权限的控制

封装的效果

  1. 将属性和行为作为一个整体,来表现生活中的事物
  2. 将属性和行为 加以权限控制
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;      // 高度
};

总结structclass 区别?
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值