C++核心——类的封装

C++核心——类的封装

封装是一种思想,简单的理解,就像是一个黑盒子,内部有一堆东西,外部留了一些说明(一般称为接口)供使用,不必在意内部是什么东西,只要知道是干嘛的就好,这也符合生活的事务的规律,例如电脑,它预留出了键盘、屏幕等交互设备,你知道怎么用这些东西就好,不必知道内部怎么实现的,而且封装的好处还有一个就是,我想让你知道的你就能知道,我不想让你知道的你就没法知道,比如,当你足够牛的时候,Linux系统是开源的,你可以通过读源码了解到内部是如何实现这些功能,二Windows是商业的,他不给你提供源码,你就没法知道内如何运作的。其实在学习类之前也是有封装的,比如函数就是对语句的一种封装,从而实现代码的复用。说了这么多,还是切入主体吧,在了解封装之前,需要先了解这个概念。

类和对象的概念

类是一类事物的抽象的集合,是一种抽象的概念,而对象就这个抽象概念下一个实实在在的,具体化的东西。一个简单的例子就是人和张三,人是一个统称,没有具体的实实在在的东西,是一个抽象的概念,所以人是一个类,而张三在不考虑重名的前提下,他就是代表实实在在的某一个人,所以张三是一个对象,还有一个前提就是张三是人的一个对象不是别的东西的对象。还有一点需要注意的是,对象和类都是相对而言的,意思就是说对象是对类的一个具体化,只要对某一个类实现了具体化或者叫实例化,那么它就是一个对象。比如,如果再换一个概念,我在人的基础上再抽象处已个东西叫生物,那么生物就是人的类,而人就是生物这一个概念的对象,但是人确实张三的抽象概念,所以人还是张三的类。

类的定义,如何实例化一个对象

先以上面的例子直接上演示代码

class CPerson
{
	string name;
	string sex;
	int age;
};
CPerson p0;

通过关键字class创建一个Person类,通过类名接对象名来实例化对象。人都有姓名、性别、年龄,这些都是人的属性。看到这里是不是和某个东西很类似,没错和结构体几乎一模一样。

类与结构体的区别

typedef struct SPerson
{
    string name;
    string sex;
    int age;
}SPerson;
SPerson p1;

从表面看是一模一样,就是将不同的数据类型重新组合成一种新的类型,其实这么理解也没有错,类其实就是一种组合类型。既然如此,还弄这么一个复杂的概念干嘛呢,别急,接下来看看两者的使用有什么区别。

#include <iostream>
#include <string>
using namespace std;

typedef struct SPerson               # 构建一个SPerson的结构体
{
    string name;
    string sex;
    int age;
}SPerson;


class CPerson					    # 构建一个CPerson的类
{
    string name;
    string sex;
    int age;
};

int main()
{
    SPerson p0;						# 创建一个Sperson数据p0
    p0.name = "zhangsan";
    p0.sex = "boy";
    p0.age = 10;

    cout << p0.name << p0.sex << p0.age << endl;

    CPerson p1;						# 实例化Cperson的对象p1
    p1.name = "zhangsan";
    p1.sex = "boy";
    p1.age = 10;
    cout << p1.name << p1.sex << p1.age << endl;
    return 0;
}

*******************************运行结果**********************************
PS D:\study\language_C> g++ .\03_类与封装.cpp
.\03_类与封装.cpp: In function 'int main()':
.\03_类与封装.cpp:15:12: error: 'std::__cxx11::string Person::name' is private
     string name;
            ^
.\03_类与封装.cpp:23:8: error: within this context
     p1.name = "zhangsan";
        ^
.\03_类与封装.cpp:16:12: error: 'std::__cxx11::string Person::sex' is private
     string sex;
            ^
.\03_类与封装.cpp:24:8: error: within this context
     p1.sex = "boy";
        ^
.\03_类与封装.cpp:17:9: error: 'int Person::age' is private
     int age;
         ^
.\03_类与封装.cpp:25:8: error: within this context
     p1.age = 10;
        ^
PS D:\study\language_C>

整个编译就报错,很明显现结构体部分是没有问题的,那么肯定是类出了问题,从运行结果来看就是给p1的属性赋值出了问题,结果提示“is private”,没错这就是两者的区别,类中的属性默认是私有的,不可以直接被外面访问,而结构体默认是公有的,可以随便访问和修改,这也符合现实规律,比如一个人张三,他的姓名、性别和年龄是不可能随便给别人修改的呀。这就是结构体和类最大的区别: 默认的访问权限不同,struct 默认权限为公共,class 默认权限为私有。至于什么是权限,这个后面会继续介绍。

现实中人出了有属性外,还有行为,比如说话,走路,吃饭等,所以类中还有行为,在程序里面用函数表示行为,所以类中还有函数,这也是类与结构体的另外一个区别,当然结构体重也可以存放函数指针来实现这个功能,不过可能我才疏学浅,还没这么用过。综合以上两点,其实一个真正的类是包含属性和行为的集合,一版的形式如下:

class CPerson
{
private:
	string name;
	string sex;
	int age;
public:
	void speck()
	{
		cout << "speak" << endl;
	}
};
CPerson p0;

权限

上面提到了权限,这里简单做个介绍

公共权限 public 类内可以访问 类外可以访问 可以被继承
保护权限 protected 类内可以访问 类外不可以访问 可以被继承
私有权限 private 类内可以访问 类外不可以访问 不可以被继承

上面提到的继承,这个是另一个特性,后面会接续介绍。

总结

从最终类的定义形式可以看出,其实类就是把属性和行为集合到一起从而实现封装的概念。通过封装还可以进一步实现权限操作,从而保证数据的安全性。简单来说使用了类的概念就是使用了封装的概念,类是封装的一种实现形式。

发布了14 篇原创文章 · 获赞 0 · 访问量 2390

猜你喜欢

转载自blog.csdn.net/wtzhu_13/article/details/105156097