C++深度解析 类与封装的概念---public private(14)
类通常分为以下两个部分
类的实现细节
类的使用方式
类的封装
当使用类,不需要关心其实现细节
当创建了类,才需要考虑其内部实现细节
例如:
普通用户使用手机:只需要学习如何发短信,打电话,拍照,等等。
手机开发工程师:需要考虑手机内部的实现细节。
封装的基本概念
根据经验:并不是类的每个属性都是对外公开的。
- 如:女孩子不希望外人知道自己的体重和年龄
- 如:男孩子不希望别人知道自己的身高和收入
而一些类的属性是对外公开的。
- 如:人的姓名,学历,国籍,等。
必须在类的表示法中定义属性和行为的公开级别
- 类似文件系统中文件的权限
C++中可以给成员变量和成员函数定义访问级别
public
成员变量和成员函数可以在类的内部和外界访问和调用
private
成员变量和成员函数只能在类的内部被访问和调用
示例程序:
#include <stdio.h>
struct Biology
{
bool living;
};
struct Animal : Biology
{
bool movable;
void findFood()
{
}
};
struct Plant : Biology
{
bool growable;
};
struct Beast : Animal
{
void sleep()
{
}
};
struct Human : Animal
{
void sleep()
{
printf("I'am sleeping...");
}
void work()
{
printf("I'am working...");
}
};
//类
struct Girl : Human
{
//访问级别为私有
private:
int age;
int weight;
//访问级别是公有,外界是可以调用的
public:
void print()
{
//属性
age = 22;
weight = 48;
//行为
printf("I am a girl, I'm %d years old.\n", age);
printf("My weight is %d kg.\n", weight);
}
};
//类
struct Boy : Human
{
//访问级别为私有
private:
int height;
int salary;
//访问级别是公有,外界是可以调用的
public:
//属性
int age;
int weight;
//行为
void print()
{
//成员函数是可以访问类的成员变量
height = 175; //因为private可以在类内部被访问和调用
salary = 9000;
printf("I am a boy, my height is %d cm.\n", height);
printf("My salary is %d RMB.\n", salary);
}
};
int main()
{
//创建了一个对象g,这个对象g属于Girl类
Girl g;
//创建了一个对象b,这个对象b属于Boy类
Boy b;
//printf("g.age = %d\n", g.age); //错误的,因为age是private
g.print();
b.age = 19;
b.weight = 120;
//b.height = 180; //错误的,因为height是private
b.print();
return 0;
}
结果如下:
类成员的作用域
类成员的作用域都只在类的内部,外部无法直接访问。
成员函数可以直接访问成员变量和调用成员函数。
类的外部可以通过类变量(对象)访问public成员。
类成员的作用域与访问级别没有关系。访问级别仅仅是防止外部的函数访问类的成员变量,或调用类的成员函数。
(PS:C++中用struct定义的类中所有成员默认为public)
示例程序:
#include <stdio.h>
//全局变量i
int i = 1;
struct Test
{
private:
//类成员变量i
int i;
public:
int j;
int getl()
{
i = 3;
return i;
}
};
int main()
{
//局部变量i
int i = 2;
Test test;
test.j = 4;
printf("i = %d\n", i); //访问局部变量i, i = 2
printf("::i = %d\n", ::i); //::访问默认命名空间(全局作用域)变量, 全局变量::i = 1
//printf("test.i = %d\n", test.i); //错误的,因为test.i是私有的
printf("test.j = %d\n", test.j); // test.j = 4
printf("test.getl() = %d\n", test.getl()); // test.getl() = 3
return 0;
}
结果如下:
分析:如果要访问一个类的成员变量或者成员函数,必须通过类对象,就可以访问类的成员变量和类的成员函数。是否访问成功,还得看成员变量和成员函数的访问级别,所以类成员的访问级别和类成员的作用域是两个概念。
小结:
类通常可以分为使用方式和内部细节部分。
类的封装机制使得使用方式和内部细节相分离。
C++中通过定义类成员的访问级别实现封装机制
public成员可以在类的内部和外界访问和调用
private成员只能在类的内部被访问和调用