白话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; }
运行结果: