现实世界中,将事物的属性和行为表示出来,就可以抽象出这个事物。
定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的行为,这样就可以表示一个事物。在C中,行为和属性是分开的。
属性和行为应该放在一起,一起表示一个具有属性和行为的对象。封装提供一种机制能够给属性和行为的访问控制权。
所以说,封装包含两个方面:1)属性和变量合成一个整体;2)给属性和访问增加权限。
C中struct只有变量,C++中struct既有变量又有函数
class默认访问权限是private,struct默认访问权限是public。
访问权限------1、在类的内部(作用范围内),没有访问权限之分,所有成员可以互相访问;
2、在类的外部(作用域范围外),访问权限没有才有意义,public,protected,private
3、在类的外部,只有public修饰的成员才能被访问,在没有涉及继承与派生时,protected和private是同等级的
访问属性 | 属性 | 对象内部 | 对象外部 |
public | 公有 | yes | yes |
protected | 受保护 | yes | no |
private | 私有 | yes | no |
C语言下的封装
#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 mName[64];
int mAge;
};
void DogEat(struct Dog *dog)
{
printf("%s在吃狗粮\n", dog->mName);
}
void test02()
{
struct Dog d;
strcpy(d.mName, "旺财");
DogEat(&d);
struct Person p1;
strcpy(p1.mName, "老忘");
DogEat(&p1);
}
//C语言封装 属性和行为分开处理 类型检测不够
int main(void)
{
test02();
system("pause");
return 0;
}
C++下的封装
#define _CRT_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();
Dog d;
strcpy(d.mName, "aa");
d.DogEat();
}
//struct和class是一个意思,唯一的不同 默认权限struct是public
//如果不声明权限,class默认private
class Animal
{
int m_Age;
void eat(){
m_Age = 100;
}
public:
int height;
protected:
int weight;
};
//所谓私有权限 就是私有的成员在类内部可以访问,在类的外部不能访问
void test02()
{
Animal an;
//an.eat();
an.height = 10;
}
int main(void)
{
test01();
system("pause");
return 0;
}
将成员变量设置为私有private
1)可赋予客户端访问属性的一致性;
2)可细微划分访问控制。