1 对象的初步认识
C语言在解决问题的时候需要考虑如何一步一步的去解决!这种我们称之为面向过程!面向对象,就是将问题变成几个对象之间的交互就可以了,不需要具体关心怎么做!举个例子来理解一下:如果我们要吃西红柿炒蛋这个菜,我们是不是需要一系列的步骤才可以将西红柿炒蛋做好!而如果从面向对象这个角度来看,我们只需要关注商家,app,骑手等这几个对象来交互,我们也可以吃到西红柿炒蛋,至于是怎么做的,我们并不关心!
2 struct和class关键字
C++是兼容C语言的,在C语言的基础之上,将struct关键字进行了升级,也可以用来定义类,代码如下:
struct Person { int age; double weight; double height; void print() {} void init() {} }; int main() { Person p; return 0; }
我们可以看到,在C++中我们可以直接利用Person进行定义类型,而C语言是必须带上struct的!并且可以直接定义函数!此时的Person准确来说其实就是一个类,p是一个对象。类中的age,weight,height称为成员变量,里面的函数称为成员函数。
而我们一般采用class关键字来进行定义类!
2.1 类的定义
从上面我们可以知道,类一般是由class关键字进行定义的,定义的方式一般有两种:
第一种就是我们上面写的那样,函数的声明与定义全部写在类体里面。
这种写法需要注意的是编译器可能会将成员函数当做
内联函数
来处理
第二种就是用法如下:
我们一定要加上域限定符,让编译器知道定义的这个init函数是属于Person这个类的!
2.2 成员函数的命名规则
对于以上辨别传入的值是赋给形参的还是类中声明的呢?根据局部优先,这里应该是形参,可是这样写代码的阅读性是很差的,所以我们应该做出区分!在类的声明时,我们应当做出区别:
2.3 类的访问限定符
通常有private,protected,public三种访问限定符
private和protected只能在类里面进行访问(两者的区别在后续会介绍),public在类的外面也是可以访问的
用法如下:
我们可以知道成员变量我们是使用了private,在类外不可以直接进行访问的,成员函数则采用了public限定符!
1 如果我们没有标识访问限定符,struct定义的类默认public,class定义的类默认private
2 限定符是有作用的范围的,以上面为例,private的作用范围就是在下一个限定符之前也就是public前,后面直到类结束
都是public
2.4 类的作用域
其实在C++中{}
就是一个作用域,在类外需要使用类中的成员需要::
(域操作符来表明是哪一个类域)
3 类的大小的计算
类的大小和类的对象的大小其实是一样的。其实对于类的大小的计算,代码如下:
根据内存对齐规则我们可以发现,其实只计算成员变量的大小。而没有计算成员函数的大小!实际上是因为成员函数的指针并没有存储在对象里面,而是存储在一个公共代码区,需要用到的时候去调用就行了,所以我们计算类的大小是不包括成员函数的!!!
我们再来看看这样一段代码:
对于空类的大小我们会有1个标识位来标识对象。
4 类成员函数指针this
从上面我们可以知道,成员函数都是存放到公共代码区,那么我们如何根据对象的不同,来实现不一样的输出呢?其实这里就涉及了this指针!而这个this指针是不可以显式的表现出来,是由编译器自己完成的:
其中,this是不可以更改指向的(如果const在*前面,就说明指针指向的内容是不可以改变的)!
关于this指针这里有一个经典的问题:this指针可以为空吗?
class Person { private: int _age; double _weight; double _height; public: void print() { cout << "print" << endl; } void init(int age, double weight, double height) { _age = age; _weight = weight; _height = height; } }; int main() { Person* p = nullptr; p->print(); return 0; }
你觉得代码的运行结果是什么呢?有许多人认为空指针,会运行错误!事实真的如此吗?我们给上运行结果:
我们上面已经讲过了,成员函数的指针是不存在类的对象里面的,在公共代码区,所以我们是可以通过这样一个 Person类型来调用函数的!!!我们再来看这样一段代码:
此时还是可以调用函数的,但是由于this指针是空指针,访问成员变量是非法的,所以就会出现运行错误!!!