类与对象
我们在C语言中自定义的struct 叫做结构体,而在C++中我们把struct升级为了类,并且还加入了一个class,也称为类,那么我们今天就来看一下结构体和类的不同和相同
1.结构体与类
我们在C语言中的结构体是struct,而在我们的C++中升级成了类
我们先看一下它们有什么不同
我们先看一下C语言中结构体是如何定义的,这个是我们在C语言中的结构体,如果我们像定义一个obj的对象该怎么弄?
我们看到就是这样,我们需要把struct也写上,所以在C语言中o变量的类型就是struct obj,那么如果我们在C++中该怎么做呢?
我们在C++中struct升级为了类,而在C++中,我们的obj就是对象名,但是我们也可以前面加struct,因为这是为了兼容C语言的语法,不过如果想在C语言中也直接使用obj也是可以的,需要在前面加typedef这个就不演示了
2.类
既然struct在C++中升级为了类,那么C++中其他的类的特性是什么?
我们下面来看一下。
在C++中除了struct可以定义自定义类型外还可以用class来定义,我们先用struct来看一下
由于C语言的封装性太差,我们可以直接访问到类里面的对象,所以使用起来并不是特别的好,那么在C++中,我们还可以在类里面写函数,我们还加入了访问限定符(private protected public)这三个限定符的作用是有不同的作用
下面我们来看一下
2.1 访问限定符
首先是private
这个是private,这个有什么作用呢??
如果我们想访问这里面的三个变量中的任意一个可以吗??
我们看到是不可以的,因为private的意思是私有,在private到下一个访问限定符之前里面的成员函数或者是成员变量都是在该类外面不可访问的,所以不可以直接这样访问
下面在看一下protected
如果是protected呢?
我们还是访问里面三个变量中的任意一个
我们看到protected和private在这里一样都是在类外面不可访问的,这里看不出他们的区别,后面会有不一样的,这里先不说
还剩一个public
这时候我们还是访问里面的变量
这时候我们再看一下 ,我们访问能不能成功
我们看到 这时候是可以访问的,并且还可以修改
2.2 struct 和 class的区别
那么steuct和class的区别是什么呢??
同样是自定义类型他们的区别在哪里呢?
我们来看一下
如果我们不给访问限定符会怎么样?
这时候我们没有给访问限定符,我们想访问一下这里面的变量可以吗?
我们看到是可以的
那么如果这时候我们换成class会怎么样呢??
我们现在还是访问里面的变量
我们看到是不可以访问的,并且我们看到显示stack里面的a是private的,这里说明我们的class没有给访问限定符,但是默认访问限定符是private的,而我们的struct默认访问限定符是public的
结构体和类的区别 (2)
在C语言结构体中,里面只可以放变量,但是在类中我们还可以放函数
我们来看一下,因为这样可以更好的管理
我们还可以这样,把属于这个类的函数也放在这个类里面,在类里面的函数我们成为成员函数,在类里面的函数,而会自动成为内联函数
那么如果我们想调用这个类里面的函数怎么调用呢??
我们在类里面的函数我们直接这样调用
我们直接 “对象.“调用
我们来看一下
我们调用成功
2. 隐藏的this指针
我们来看一个类
我们这里有一个日期类
我们继续看
我们现在定义两个日期类的对象,并且初始化一个,然后我们就分别打印两个对象我们会发送什么呢?
我们一个是缺省值,另一个是给定的值
但是我们调用这个Print函数为什么会打印出不同的内容呢?也就是我们可以分别打印出d1 和 d2的值呢?
这是为什么呢??
这里直接说了,因为在我们成员函数中都有一个默认的this指针
就像这样,如果调用这两个函数,我们的d1. 和 d2. 分别会传入Print函数,就像这样
然后我们打印的时候是这样打印
我们就是这样调用,那么我们传入的时候也是这样
我们调用的时候就是把d1和d2这样传入进去
但是我们在对成员函数传参的时候,我们不能显示的传入this指针,也不能显示的在函数参数那里显示的加上this指针 。
而this指针的传入1编译器就帮我们做了,所以我们也不需要显示的传,但是我们可以在函数中显示的使用
就像这样,我们可以显示的使用
正是因为有这个this指针,所以我们可以准确的打印出对应变量里面的值
所以如果我们想写这个函数的Init函数我们可以直接这样
我们可以这样初始化
我们打印看一下
我们看到是可以的,这个就是隐藏的this指针