类和类的封装

在日常生活中,我们总是将事物进行分门别类。列如:电脑,手机,相机等等,这些称呼都是对于某一类事物的总称。我们还能将电脑按照品牌分类,比如,戴尔电脑、惠普电脑、苹果电脑、华硕电脑等。这些都是抽象的概念。我的电脑这个实体,它就是一个具体的事物,我的电脑是戴尔的,但我不能说戴尔电脑是我的电脑。

一、面向对象的基本概念

类和对象是面对对象的两个基本概念,“类”指的是一类事物,是一个抽象的概念,比如我们所说的电脑;而“对象”指的是属于摸个类的一个实体,是一个具体存在的事物,比如我的电脑;
类是一种“模板”,可以通过这种模板创建出不同的对象“实例”,而对象“实例”是类“模板”的一个具体实现;一个类可以有很多对象,而一个对象必然属于某个类。
同一个类的不同对象都有对应的类中的属性和行为,但是这些属性和行为可能不完全相同。
从上面的描述我们可以知道,类是用于抽象的描述一类事物所特有的属性和行为,比如:电脑类的每个对象都有CPU,内存和硬盘,电脑类的每个对象都可以开机和运行程序。
而对象是一个具体的事物,拥有其所属类的所有属性,并且每个属性都是一个特定的值。比如:老虎的每个对象(也就是每只老虎),都有不同的体重,不同的食量以及不同的性情。
属性主要用于描述类的静态特性,行为主要用于描述类的动态特性。如:老虎类的属性有颜色,体重,而行为有捕猎和逃跑,而兔子类的属性也有颜色和体重,但是兔子类的行为没有捕猎,只有逃跑。另外,从一个更高的层面看,老虎和兔子都属于动物类,它们都继承了动物类的属性和行为,另外又又自己特定的属性和行为。

二、继承

按上面所说,我们所说的电脑类,在电脑类的基础上,我们又可以将电脑类按照品牌换分为戴尔电脑、惠普电脑、苹果电脑、华硕电脑等。但是我们可以发现,戴尔电脑、惠普电脑、苹果电脑、华硕电脑这些类和原来的电脑类是有关系的,这种关系就叫做继承。继承的类拥有原来的类的所有属性,如戴尔电脑就是一种电脑,它同样拥有CPU,内存和硬盘。
继承出来的心累可以拥有自己特有的属性和行为。

三、在程序中表示类

说了那么多,怎么在程序中表示一个类呢?
C++提供了如char、int、long、float、double等基本数据类型,足够用来解决大多数哦相对简单的问题,但对于复杂的问题就比较困难了。
C++的一个实用特性是自定义数据类型;如之前的枚举和结构体:

struct DateStruct{
    int year;
    int month;
    int day;
};

枚举和结构体代表了传统的面向过程编程,它们只包含数据,如果需要访问此类型变量,必须提供自定义函数,并以该类型变量为参数。在OOP世界中,我们希望自己的类型不仅包括数据,也包括操作数据的函数;C++中,通过class关键字来声明一个类。

class Date{
public:
    int year;
    int month;
    int day;
};

类似结构体,类的声明没有分配内存,只是说明了类的结构;类的声明以分号结尾;
为了使用类,可以声明一个该类型的变量:

Date today;
today.year = 2016;
today.month = 12;
today.day = 28;

声明一个类的变量,也叫实例化一个类;该变量称作为类的一个实例,或者对象。
类不仅仅包含数据(属性),亦可以包含函数(行为),称作成员函数:

class Date{
public:
    int year;
    int month;
    int day;
    void SetDate(int year,int month,int day)
    {
        this->year = year;
        this->month = month;
        this->day = day;
    }   
};

成员函数可以类似访问成员变量,使用’.’来使用。

四、类的封装

类通常分为以下两个部分:类的实现细节和类的使用方式。当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节;列如,我们在使用手机时,只需要知道怎么打电话,发短信,拍照等功能怎么使用就行了,而不必知道手机内部的实现细节。而手机开发工程师就需要知道其中的细节问题。
根据日常生活中的经验:并不是类的每个属性都是对外公开的,而一些类的属性是对外公开的,因此,需要在类的表示法中定义属性和行为的公开级别。
在C++中,可以对类的成员设置访问权限。C++提供了3种不同的访问标识符:public、private、protect,分别是公有的、私有的和保护的。

class Date{
public:
    int date_A;//公有 
    int GetA(){return date_A;}//公有 
private:
    int date_B;//私有 
    int GetB(){return date_B;}//私有 
protected:
    int date_C;//保护的 
    int GetC(){return date_C;}//保护的 
};
int main()
{
    Date date;
    int cout;
    date.date_A = 1;    //公有 ,可访问 
    cout = date.GetA(); //公有 ,可访问 
    date.date_B = 2;    //私有 ,不可访问 
    cout = date.GetB(); //私有 ,不可访问 
    date.date_B = 3;    //保护 ,不可访问 
    cout = date.GetC(); //保护 ,不可访问 
} 

类成员的作用域都只在类的内部,外部无法直接访问,成员函数可以直接访问成员变量和调用其它成员函数;类的外部可以通过类变量访问public成员,类成员的作用域与访问级别没有关系。
C++中用struct定义的类的所有成员默认为public;用class定义的类,在不使用访问标识符的情况下,默认是私有的。
封装的思想就是将实现的细节隐藏,而暴露公有接口;
C++中的访问标识符,可以实现在类中的封装;通常是将所有的成员变量私有化;
尽管看起来访问成员变量的不直接,但使程序更有可重用性和可维护性;
A)封装实现,无论类的实现如何改变,只要对外的接口不发生变化即可。

class Change{
public:
    int m_Value;
}; 
int main()
{
    Change change;
    change.m_Value = 10;
    printf("%d\n",change.m_Value);
    return 0;
}

如上,如果m_Value被重命名了,那么main函数中访问就会出错;
如果提供了m_Value的访问函数:

class Change{
private:
    int m_Value;
public:
    int GetValue(){return m_Value;}
    void SetValue(int value){this->m_Value=value;}
}; 
int main()
{
    Change change;
    change.SetValue(10);
    printf("%d\n",change.GetValue());
    return 0;
}

B)隐藏了类的实现,类的使用者只需知道公共的接口,就可以使用该类;
C)封装帮助防止意外的改变和误用;
D)对程序调试有很大的帮助,因为改变类的成员变量只用通过公共接口。
参考:河祖哥——–C++学习第9篇—类和类的封装

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值