在上周,我将VS2010升级到了VS2019,并且进一步学习了C++的知识。众所周知,类和对象是C++中最为关键的知识,那么这一篇博客就来为大家介绍C++中的类和对象。
何为对象?对象可以理解为一个具体的实例。何为类?用定义来说,类就是定义同一类所有对象的变量和方法的蓝图或原型。举一个例子,比如说,有一条狗,他就是一个对象,我们可以从它的身上抽象出各种信息,比如名字、年龄、品种等,而且我们还可以抽象出他的技能:叫和跑。我们可以把狗的信息看作是变量,狗的技能看作是方法,它们作为成员共同构成了这一“类”。接下来我们就看一下,在C++中,我们是怎么定义一个类的。
class+类名,然后在后面加上大括号就可以定义类(别忘了最后要加上分号)。在这里,我们抽象出了狗的一些信息,其中包括了字符串类型变量name和variety,整型变量age以及speak();和run();两个方法。那么有人会问,为什么不抽象出狗肉的蛋白质含量,或者狗的出栏周期呢?那是因为我们不是为了吃狗肉。这也说明了,目的不同,从对象中抽象出的信息也不同。
我们再看一个例子。一个电视,它可以有牌子、型号这一些信息,还有切换频道、增加减小音量这些方法。但是在电视机里面,有各种集成电路的工作,这些都是我们看不到的,如果将这些暴露给看电视的人,那么就会引起看电视的人的“不适”。所以,在定义类的时候,要分清楚什么是要暴露出来的,什么是要隐藏起来的,这就叫做“封装”。进而也就引出了“访问限定符”这个概念。
在类中,有三个访问限定符,分别为:public,公共的;private,私有的;protected,受保护的。在这里我只介绍前两个。我们需要暴露出来的成员就用public来修饰,需要隐藏起来的成员就用private来修饰,具体使用方法如下:
如上图,我们就可以区分需要暴露出来的和需要隐藏的成员。
那么,我们如何访问类里面的成员呢,这里就要用到“对象的实例化”。
对象的实例化,就是计算机根据类的设计,制造出多个对象的过程。对象的实例化有两种方式,一个是从栈实例化对象,另一个是从堆实例化对象。什么是栈和堆?简单来说,他们都是内存的区。栈就是编译器在使用的时候自动分配,且在不使用的时候自动清除的内存区,里面一般是局部变量、函数参数等;堆就是需要用关键字new分配的内存块,需要我们自己去申请内存空间,并且使用完毕后要用delete手动释放空间。了解了栈和堆,我们就来看一下如何从他们二者之中实例化对象。
从栈实例化对象的方法很简单,如果要定义一个对象,就用类名+对象名来定义;如果是要定义多个对象,就用类名+对象名数组来进行定义。
从堆实例化有所不同,定义方法是;类名+指针=new 类名()。如果是一组对象,则把最后的小括号改为中括号。在最后,要将申请的空间释放,并且要让指针悬空。
接下来,我们就可以访问对象中的各个成员了。
上图是从栈实例化对象后,访问成员的方法。方法为对象名.数据成员名或对象名.成员函数名。
上图是从堆实例化对象后,访问对象的方法。需要指针名->(复合符号)数据成员名或成员函数名。
下面这段代码是通过两种不同方式实例化对象并且对成员进行访问的一个例子:
```
#include <iostream>
#include <string>
using namespace std;
class Coordinate
{
public:
int x;
int y;
void printX()
{
cout << x << endl;
}
void printY()
{
cout << y << endl;
}
};
int main(void)
{
Coordinate coor;
coor.x = 10;
coor.y = 20;
coor.printX();
coor.printY();
Coordinate* p = new Coordinate();
p->x = 100;
p->y = 200;
p->printX();
p->printY();
delete p;
p = NULL;
system("PAUSE");
return EXIT_SUCCESS;
}
```
运行结果为:
不难发现,在类的定义中,我们只用了public访问限定符,这说明在定义类的时候,访问限定符不一定要全部使用,要视情况而定。
本文先讲到这里,下一篇中将会介绍string字符串的用法,以及继续介绍类和对象的知识。