今天来到了类和对象部分,我们知道C语言是面向过程编程,而C++是面向对象编程,那么怎么个具体实现方法呢?简单来说,就是C语言对结构体的定义和对结构体的操作是分开的,这样就显得过程很独立;而C++是把结构体和函数是定义在一起的,当然在这里我们把结构体升级成了类,这就是我们所说的类和对象中的类
下面我们来对比一下C语言和C++中的不同,我们用C语言写一个结构体和函数
#include<stdio.h>
#include<assert.h>
typedef struct QueueNode {struct QueueNode* next;int val;
}QNode;typedef struct Queue {QNode* front;QNode* rear;int size;
}Que;void QueueInit(Que* pq) {assert(pq);pq->front = NULL;pq->rear = NULL;pq->size = 0;
}void QueuePush(Que* pq, int x) {//......
}
这是我们写C语言时的一些操作,看以看到它的函数和结构体是分离的,下面看一下C++是怎么实现栈的
#include<iostream>
using namespace std;
struct stack {int* _a;int _top;int _capacity;void Init() {_a = nullptr;_top = 0;_capacity = 0;}void Push(int x) {//....}
};
我们可以看到,函数都写到了类的里面,这就是面向对象的一个特征
而在正常的C++中呢?我们习惯把struct换成class并且引入访问限定符,访问限定符有public意思是外部可以访问,还有一个private,意思是外部无法访问,当然class如果不写访问限定符有的话是私有的,而struct是外部可以访问的
我们在写类的成员函数时要把声明和定义分离,因为默认在类里面定义的函数就是内联函数,所以我们一般把短小的函数的定义放到类里面当作内联使用,效率比较高,而其它的函数则声明和变量分离
类或者是类创建的对象的大小只考虑成员变量,而计算所有成员变量的大小时则要考虑内存对齐
下面是一个我写的关于内存对齐的一篇文章
链接:内存对齐
那如果是一个类中没有成员变量呢?那么它的大小就是一个字节,这个字节不存储有效数据,只能证明它存在过
不知道你有没有发现,我在栈的初始化函数中没有传任何参数,但是在函数定义时我还是能调用栈中的成员变量,这是因为编译器会隐藏的传一个this指针,这个指针就是指向你要操作的对象,this指针不能显示的传但是能显示的用
这里的this指针是不能更改指向的
报错说左操作数必须为左值
下面有这样的一个程序,判断这个程序会不会报错
这个程序其实是不会报错的,因为虽然p是一个空指针,但是我并没有去访问p指向的对象的成员变量,我只是调用了一个函数,并且这个函数的地址也没有存放在对象中,而这个p->的意思仅仅是告诉编译器我调用的是A类中的函数
但凡改成打印_a的话,它就会运行时崩溃