【C++】类和对象一

今天来到了类和对象部分,我们知道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的话,它就会运行时崩溃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之Axios的详细解析

1.3 Axios 上述原生的Ajax请求的代码编写起来还是比较繁琐的&#xff0c;所以接下来我们学习一门更加简单的发送Ajax请求的技术Axios 。Axios是对原生的AJAX进行封装&#xff0c;简化书写。Axios官网是&#xff1a;https://www.axios-http.cn 1.3.1 Axios的基本使用 Axios的…

知识库文档处理

知识库文档处理 1 知识库设计2 文档加载2.1 PDF文档2.2 MD文档2.3 MP4视频 3 文档分割4 文档词向量化 本项目是一个个人知识库助手项目&#xff0c;旨在帮助用户根据个人知识库内容&#xff0c;回答用户问题。个人知识库应当能够支持各种类型的数据&#xff0c;支持用户便捷地导…

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(二):面向对象思想

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:面向对象思想,子节点表示追问或同级提问 面向对象基…

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏3(附项目源码)

文章目录 先本文看看最终效果前言二叉空间分割算法房间优先生成使用走廊连接各个房间BSP和随机游走源码完结 先本文看看最终效果 前言 前两期我们使用了随机游走算法已经实现了地牢的生成&#xff0c;本期再说另外一种生成地牢的方法&#xff0c;使用二叉空间分割算法&#xf…

Git——分布式版本控制工具

一、概述 1.开发中的实际场景 备份代码还原协同开发追溯问题代码的编写人和编写时间 2.版本控制器的方式 集中式版本控制工具 集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代码&#xff0c;是必须联网才能…

nodejs微信小程序 +python+PHP- 校园志愿者管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Go 语言中 For 循环:语法、使用方法和实例教程

for循环用于多次执行特定的代码块&#xff0c;每次都可以使用不同的值。每次循环执行都称为一次迭代。for循环可以包含最多三个语句&#xff1a; 语法 for 语句1; 语句2; 语句3 {// 每次迭代要执行的代码 }语句1&#xff1a;初始化循环计数器的值。语句2&#xff1a;对每次循环…

微信小程序如何使用scss,less

搜到很多都是先VSCode安装好…插件…。这都是很久之前的方法了&#xff0c;所以想写这篇文章 一、修改project.config.json配置文件 "setting": {"useCompilerPlugins": ["sass"]},二、然后就可以删除 .wxss 文件了&#xff0c;就用 .scss 文件…

腾讯极光盒子A4021增强版_线刷官方

1、用USB_Burning_Tool线刷提供的线刷包&#xff0c;所需资料地址在最后 1&#xff09;打开USB_Burning_Tool&#xff0c;选择资料里的A4021_line_flash_root.img&#xff08;文件夹最好没有中文字符和空格&#xff09;&#xff0c;然后点击【开始】。 2&#xff09;盒子准备好…

mac添加Chrome插件的方法

如果是.crx的插件 更改后缀crx为zip 后续步骤同下文.zip文件 如果是.zip的插件 使用终端进行解压 注意不要用解压工具解压&#xff0c;一定要用终端&#xff0c;命令行解压 // 进入到“插件名.zip”文件的目录下&#xff0c;输入下面命令&#xff1a; unzip 插件名.zip -…

LeetCode209.长度最小的子数组(滑动窗口法、暴力法)

LeetCode209.长度最小的子数组 1.问题描述2.解题思路3.代码4.知识点 1.问题描述 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果…

阿里云优惠券如何领取(阿里云在哪领取优惠券)

阿里云优惠券是阿里云为了回馈广大用户而推出的一种优惠活动&#xff0c;可以帮助用户在购买阿里云产品和服务时享受一定的优惠&#xff0c;本文将为大家介绍如何领取阿里云优惠券。 1、通过阿里云官网活动页面领取 阿里云会不定期举办一些优惠活动&#xff0c;例如双十一、双…

C语言基本算法之选择排序

目录 概要&#xff1a; 代码如下 运行结果如下 概要&#xff1a; 它和冒泡排序一样&#xff0c;都是把数组元素按顺序排列&#xff0c;但是方法不同&#xff0c;冒泡排序是把较小值一个一个往后面移&#xff0c;选择排序则是直接找出最小值&#xff0c;可以这个说&#xff…

IDEA如何将本地项目推送到GitHub上?

大家好&#xff0c;我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持多种编程语言和工具。它也内置了对Git和GitHub的支持&#xff0c;让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册&#xff0c;描述了…

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员&#xff0c;有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中&#xff0c;也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中&#xff0c;我遇到了一个非常复杂的Bug&#xff0c;这个…

Apahce虚拟主机配置演示

在企业的真实环境中&#xff0c;一台WEB服务器发布单个网站会非常浪费资源&#xff0c;所以一台WEB服务器一般都会发布多个网站&#xff0c;少则3-5个&#xff0c;多个10-20个网站。在一台服务器上发布多网站&#xff0c;也称之为部署多个虚拟主机。 WEB虚拟机主机配置方法主要…

使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板

导语&#xff1a;处理大量的PDF文档可能会变得复杂和耗时。但是&#xff0c;使用Python编程和一些强大的库&#xff0c;如wxPython和PyMuPDF&#xff0c;可以使这个任务变得简单而高效。本文将详细解释一个示例代码&#xff0c;展示如何使用这些库来创建一个可以选择文件夹中的…

GDB Debugging Notes

1 Debugging programs using gdb 1.1 gdb简介 gdb是一个功能强大的调试工具&#xff0c;可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0c;主要涉及下面几个方面的操作&#xff1a; 启动程序:在启动程序时&#xff0c;可以设置程序运行环境。设置断点:程序…

数据仓库架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …

Java Finalization‘s Memory-Retention Issues 及Reference类解析

引言 《Effective Java Programming Language Guide》 一书中强烈建议不要使用java的finalize()方法去做对象消亡前的清理。因为jvm调用finalize()方法的时机并不确定&#xff0c;容易导致Memory-Retention Issues。通俗点讲就是内存没办法及时回收。 详细的见oracle的官方说明…