• 【C++】类和对象一


    今天来到了类和对象部分,我们知道C语言是面向过程编程,而C++是面向对象编程,那么怎么个具体实现方法呢?简单来说,就是C语言对结构体的定义和对结构体的操作是分开的,这样就显得过程很独立;而C++是把结构体和函数是定义在一起的,当然在这里我们把结构体升级成了类,这就是我们所说的类和对象中的类
    下面我们来对比一下C语言和C++中的不同,我们用C语言写一个结构体和函数

    #include
    #include
    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) {
    	//......
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这是我们写C语言时的一些操作,看以看到它的函数和结构体是分离的,下面看一下C++是怎么实现栈的

    #include
    using namespace std;
    struct stack {
    	int* _a;
    	int _top;
    	int _capacity;
    
    	void Init() {
    		_a = nullptr;
    		_top = 0;
    		_capacity = 0;
    	}
    	void Push(int x) {
    		//....
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们可以看到,函数都写到了类的里面,这就是面向对象的一个特征
    而在正常的C++中呢?我们习惯把struct换成class并且引入访问限定符,访问限定符有public意思是外部可以访问,还有一个private,意思是外部无法访问,当然class如果不写访问限定符有的话是私有的,而struct是外部可以访问的
    我们在写类的成员函数时要把声明和定义分离,因为默认在类里面定义的函数就是内联函数,所以我们一般把短小的函数的定义放到类里面当作内联使用,效率比较高,而其它的函数则声明和变量分离
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    类或者是类创建的对象的大小只考虑成员变量,而计算所有成员变量的大小时则要考虑内存对齐
    下面是一个我写的关于内存对齐的一篇文章
    链接:内存对齐
    那如果是一个类中没有成员变量呢?那么它的大小就是一个字节这个字节不存储有效数据,只能证明它存在过
    在这里插入图片描述
    不知道你有没有发现,我在栈的初始化函数中没有传任何参数,但是在函数定义时我还是能调用栈中的成员变量,这是因为编译器会隐藏的传一个this指针,这个指针就是指向你要操作的对象,this指针不能显示的传但是能显示的用
    在这里插入图片描述
    这里的this指针是不能更改指向的
    在这里插入图片描述
    报错说左操作数必须为左值
    在这里插入图片描述
    下面有这样的一个程序,判断这个程序会不会报错
    在这里插入图片描述

    这个程序其实是不会报错的,因为虽然p是一个空指针,但是我并没有去访问p指向的对象的成员变量,我只是调用了一个函数,并且这个函数的地址也没有存放在对象中,而这个p->的意思仅仅是告诉编译器我调用的是A类中的函数
    但凡改成打印_a的话,它就会运行时崩溃

  • 相关阅读:
    QT----QTcreater连接Mysql数据库
    vue3 | 数据可视化实现数字滚动特效
    Web开发-session介绍
    【业务功能篇104】 补充【业务功能篇99】微服务-springcloud-springboot-电商订单模块--整合支付
    Adobe Photoshop cc快速抠图与精致抠图方法
    Python复习笔记4——文件和目录操作
    (附源码)ssm汽车租赁 毕业设计 271621
    什么是阿里云ecs.c7.large服务器?附性能评测!
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    【Unity3D】基于粒子系统实现烟花特效
  • 原文地址:https://blog.csdn.net/2201_76024104/article/details/134519341