代码改变世界

白话C++系列(6)-- 类、对象及其实例化

2016-04-11 20:56  Keiven_LY  阅读(3020)  评论(0编辑  收藏  举报

C++远征之封装篇(上)

类和对象

引例-------狗

假如我们养了一条狗,它有如下信息:

信息-----姓名:旺财、年龄:1岁、品种:大型犬

技能------叫、跑

当我们具体的指代一个事物的时候,它就是一个对象

可是当我们养了多条狗时,为了便于管理,会建立一张表格

姓名

年龄

品种

大壮

1

二壮

2

三壮

1

……

……

……

……

……

……

共有技能:叫、跑

如此,就将一群狗狗的信息抽象出来了,这样就可以定义一个类了。

想一想:抽象出来的是不是狗的全部信息呢?

为什么不定义这样的信息呢?

狗肉的蛋白质含量是多少?

狗的出栏周期是多少?

这是因为,我们关注的不是吃,所以这些信息对我们没有用!!

结论:目的不同抽象出来的信息也不同。

引例-------电视机

假如有一台电视机,通过电视机上名牌标识,我们可以知道它的名字和型号;通过各种旋钮,我们可以控制它的音量,还可以接通和切断电源。那么我们用类来描述如下:

但是仍有很多实现细节在类里面没有描述,这并不意味着它就不存在,而是被隐藏起来了。比如:电路板的工作过程。如果这些通通暴露给看电视的用户,那么看电视的人一定会疯掉。其实呢,这就是选择性暴露。

把实现细节封装起来,只暴露用户所关心的部分,这就叫做封装。

如果我们把电视机的信息都罗列出来,大家一定可以判断哪些信息是需要暴露的,哪些信息是不需要暴露的。

可是这些信息都在类中定义,如何才能把想暴露的信息暴露出来,把想隐藏的信息隐藏起来呢?

这对这一问题,C++为我们提供了一个叫做访问限定符的东西。

访问限定符:

public:公共的

private:私有的

protected:受保护的

希望暴露出来的信息就使用public修饰,希望隐藏的信息就使用private修饰。

类对象的定义

对象的实例化

在C++中,类就是一个模板,对象实例化就是计算机根据类的设计,制造出多个对象的过程。

下面定义了一个TV的类,这个电视的类中有两个属性或者叫数据成员,一个是电视的名字,一个是电视的类型;另外还有两个方法或者叫成员函数,一个用来调节音量,一个用来开关电源。

实例化对象有两种方式:

(1)   从栈实例化

如果我们要对上面的类进行实例化,并且想从栈中实例化,我们可以这样做:

(2)   从堆实例化

如果我们要对上面的类进行实例化,并且想从堆中实例化,我们可以这样做:

注意:两种方式实例化的区别

从栈实例化对象,使用完之后,不需要我们自己去理睬,系统自动会将其占用的内存释放掉;而从堆实例化对象,使用完后,我们一定要将这块内存释放掉。

思考:

----通过栈也好,通过堆也好,我们已经实例化出来了对象,那么有了这些对象就算完了吗?

----我们实例化出来的这些对象就是个摆设吗?

显然,我们是不会这么无聊的,我们是要通过访问这些对象的各种成员来达到我们的目的的。

对象成员的访问

通过不同实例化对象的方法,生成的对象在访问其数据成员和成员函数的方式也各不相同。

          

栈实例化对象访问其成员        堆实例化单一对象访问其成员            堆实例化对象数组访问其成员

 

代码实践

定义一个坐标类,包含两个数据成员:横坐标x和纵坐标y,两个成员函数,分别用来打印横坐标和纵坐标。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Coordinate
{
public:
    int x;
    int y;
    void printX()
    {
        cout<< x <<endl;        
    }
    void printY()
    {
        cout<< y <<endl;
        
    }
};

int main()
{
    Coordinate coor; //在栈中实例化一个坐标对象
    coor.x = 10;
    coor.y = 20;
    coor.printX();
    coor.printY();
    
    Coordinate *p = new Coordinate(); //在堆中实例化一个坐标对象
    //这里需要判断申请的内存是否成功
    if(NULL == p)
    {
        cout<<"申请内存失败"<<endl;
        return 0;
    }
    p->x = 100;
    p->y = 200;
    p->printX();
    p->printY();
    //对象适用完之后,需要释放掉内存
    delete p;
    p = NULL;
    
    system("pause");
    return 0;
}

运行结果: