C++语言和C语言最大的区别在于在C++当中引入了面向对象的编程思想,想要完全了解c++当中的类和对象,就要从头开始一点一点的积累并学习。
我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说:面向过程的编程就是一步一步的分解一件事情的过程。比如我们想要做一份西红柿炒鸡蛋,按照面向过程的思想来看就是先去买西红柿,之后再洗西红柿,之后会打鸡蛋,接着将我们的西红柿和鸡蛋放到锅里炒,放上各种调料,最后就成为了一份西红柿炒鸡蛋。这样一步一步将一件事情逐步分解,最后达到我们想要的目的的就是面向过程的编程思想。
而对于我们的面向对象的编程思想按照同样的例子来说就是:我们家楼下有一个饭店,我们只要拿钱就可以去餐厅里面点一份西红柿炒鸡蛋。我们不需要买材料,不需要自己动手做,只需要表达我们的需求,将钱(参数)传递给我们的程序即可。
从上面的示例当中我们可以发现,面向对象和面向过程编程的区别就在于:对于一件事情的封装与处理是否完善。我们可以将嘞类想象成一个密闭的空间,在这个空间当中包括一件事物的所有特点。包括能进行的行为,所具有的属性。我们可以通过类所创建的对象得出想要的结果。
利用代码举一个简单的例子:
//定义一个狗类,包括狗的特点以及行为方法
class Dog
{
public:
void bark()
{
std::cout << "小狗汪汪叫" << std::endl;
}
void wave()
{
std::cout << "小狗摇尾巴" << std::endl;
}
private:
char color[20];
int age;
};
我们可以定义一个狗类,当中可以包括狗的颜色以及年龄,(颜色和年龄代表属性)bark和wave表示狗可以进行的行为,(行为表示方法)。
在类当中我们想要定义特定的属性和我们正常定义的变量是相同的,我们定义的类的方法和我们普通定义的函数也是相同的,所以我们的属性和方法也叫做成员变量和成员函数。
接下来我们来一步一步来认识类。
想要定义一个类,观察上面的代码我们可以知道的是,需要先编写一个class表示我们类,紧接着书写一个特定的类名,后面就是类的主体了。在类的主体当中我们还可以细分为几个部分:
在类的主体当中我们还分为三部分:权限限定符和成员函数以及成员变量。成员函数的定义就和我们普通定义的函数相同,成员变量就和我们普通定义的变量相同,需要着重介绍的就是我们的权限限定符了。
在类当中我们有一部分是想要给外界的使用者进行访问的,但是还有一部分我们不想要让外界进行访问,这个时候我们就需要使用权限访问限定符进行限制访问权限。其中访问限定符分为三种:private(私有),public(公有),protected(保护)我们允许外界访问的就可以设置为public权限,不想要让外界进行访问的就可以设置成为private权限,protected权限我们暂时使用不到所以我们先主要介绍以上两种权限访问限定符。
就像是我们代码当中展示的那样,我们的权限访问限定符一下的表示都为该权限类型,直到出现新的权限限定符或者直到代码结束为止。所以上面的代码所表示的权限为:
我们在外界就可以任意的调用公有权限当中的成员函数或者成员变量,但是却不能够使用私有属性的成员函数或者成员变量否则系统就会产生报错。
在这其中需要着重强调的是,当我们的class没有声明权限访问限定符的时候就会默认成为私有属性。而我们的结构体会默认成为公有属性的类(相信大家都听说过在C++当中将结构体升级成了类)。那么在了解完类之后我们在将我们的目光转向生成的对象上面。
最常规的解释就是我们可以将类想象成为一个图纸,我们根据图纸就可以创建许多房屋,创建好的房屋就代表了一个个的对象。我们可以根据生成的对象进行特定的建造(赋值)等操作。利用代码举一个简单的例子:
#include
//定义一个狗类,包括狗的特点以及行为方法
class Dog
{
public:
void bark()
{
std::cout << "小狗汪汪叫" << std::endl;
}
void wave()
{
std::cout << "小狗摇尾巴" << std::endl;
}
private:
char color[20];
int age;
};
int main()
{
Dog dog1;
dog1.wave();
return 0;
}
就像是我们上面的代码所展示的那样,Dog表示的是类名,我们使用类名可以创建一个变量,也就是我们经常说的对象。在创建完成对象之后再通过 . 操作符进一步引用类当中的public权限当中的内容。对于同一个类我们可以实例化出多个对象,我们可以创建出一个dog1也可以创建出一个dog2,dog3等等。使用的方法同样和我们的上面的使用方法相同。
在学会使用类创建对象之后我们需要做的就是完善一下对于类和对象的各方面的细节的地方了。
类的作用域实质上和我们的命名空间与很像,假如我们在类当中所创建的成员函数只是一个简简单单的声明的话,那么我们在类外部定义的函数就需要特别指出我们所要作用的类域是哪一个。利用代码来方便我们进行理解:
我们可以发现我们在类当中仅仅是声明了函数并没有显示定义,那么在外部定义的时候就需要使用类的名称加上我们的域作用限定符进行指定我们想要定义的类即可。运行效果和我们之前的运行效果完全相同。
接下来再来认识一下类究竟该如何计算大小。首先我们先来看结果:
我们可以发现,使用类创建的对象所占空间的大小和我们类的大小完全相同,所以我们就可以将我们的目光转向对类的具体分析上加以理解并证明。
我们会发现在类当中我们定义了两个函数和一个字符型数组,一个整型变量,怎么说都不应该只占24个字节大小的空间呀?经过我们仔细观察我们会发现,仅仅是我们定义的变量就已经占了24个字节了。事实上和我们想的一样,在类里面我们的函数并不占空间。因为我们没有必要对于每一个对象都开辟一个栈帧用于相同的函数,我们只需要创建一个函数之后,每一个对象想要使用函数的时候只需要调用该函数即可。也就是说在类当中我们的成员函数是共享的,所以不需要计算空间。剩下的部分就是我们类所占空间的大小。
需要特别提出的是:对于我们类当中的成员变量所占字节大小的计算来说其具有一定的对其要求,其对齐要求跟结构体完全相同。如下:
根据对其规则可以得出以上的结果。
作为类和对象入门的最后一部分就是this指针了。在调用我们的成员函数当中系统会向函数的形参当中默认传入一个this指针作为一个隐藏的参数让我们使用。我们可以通过this指针进行访问类当中的所有的变量。当然我们的this指针在成员函数当中也是不需要显示写出的,当我们直接调用成员变量的时候就默认是使用this指针进行引用。(可以显示的写出,但是一般都不写)例子如下:
由上面的结果我们可以知道我们可以通过直接使用和使用this指针进行引用的方法调用成员变量都是可以的。同样的我们的this指针也可以作为返回值由我们的函数返回进一步使用。