c++类和对象新手保姆级上手教学(上)
前言:
c++其实顾名思义就是c语言的升级版,很多刚学c++的同学第一感觉就是比c语言难学很多,其实没错,c++里的知识更加难以理解可以说杂且抽象,光是类和对象,看起来容易,但想完全吃透,真的挺难,所以我打算用三篇博客一起归纳介绍一下c++中关于类和对象的所有知识点。
面向过程?面向对象?
c语言是一门面向过程的语言,关注过程。
c++是一门面向对象的语言,关注对象。
那究竟什么是对象?什么是过程呢?
举个例子面向过程,我们洗衣服,一共有下面这些步骤:

c语言就是关注过程,将这些过程一个一个用函数实现就能达到目的。
而c++注重对象比如送外卖,c++就关注商家 买家 骑手等对象,然后每个对象里面又要显示他们的状态,比如骑手就有休息中,派送中,取餐中等,如下图所示:

类的定义:
c++是兼容c语言的,所以在c++中完全可以像c一样使用struct,同时c++将struct升级成了类,我们在类里面可以定义函数,升级成类后又要兼容c,有点矛盾,所以加了一个新的关键字class,所以c++中一般用class来表示类,如下图定义一个日期类:

所以不难看出c语言的struct和class一个重要区别就是class可以在里面定义函数,而且类的定义不必像struct一样加上类型,类名就是类型。
访问方法如下图:

其实光这样是访问不了函数的,接下来就需要我们的域作用限定符了。
域作用限定符:
c++提出了3种访问限定符:

public修饰的成员可以在域外直接被访问。
protected和private在域外不能直接被访问。
至于protected和private的区别,在继承中会体现,这里没什么区别。
如果没有加访问限定符就是默认权限。
那么接下来又有一个struct和class的区别:
class中默认私有。
struct中默认公有。
访问权限作用域从该访问限定符出现到下一个访问限定符出现结束(或者类结束)
如下图设置访问限定符:

在c++的惯例中成员变量都设置为私有,成员函数都设置为公有,因为惯例一般不要直接修改数据,修改数据都要函数去做,当然如果有某些函数你只希望在类里面使用,也可以弄成私有的。
类的声明和定义分离:
当一个类需要声明和定义分离时,不能按以前的方法,简单的声明定义分离,我们先来了解一下编译器的搜索原则:先局部域再全局域
类会形成一个新的域叫类域。
所以编译器默认不会去类域里面查找,所以就可能会出现定义找不到的情况,正确的声明和定义分离如下图:
头文件:

.cpp定义文件:

可以注意到此时需要在定义文件的函数名前面加上 域名::
这样编译器就会优先去该域里面查找。
计算类的大小:
既然类中可以存放函数那么类的大小跟这些函数有关系吗?函数的地址存放在类里面吗?我们可以写一个小案例测试一下。

注意成员变量的存放还是跟结构体一样遵循内存对齐,不懂内存对齐的可以看我的上一篇文章。
通过上面的测试不难看出,计算类的大小时没有算Init函数的大小,说明成员函数的地址没有存放在类里面,那它存放在哪里呢?
类的成员函数地址统一存放在一个公共区域(代码段),避免空间浪费。
写个小案例证明一下上面的结论:

我们把s1变成了空指针,但这里仍能进行正常运行,因为Print的地址在代码段,没在类里面,所以编译器没有对空指针的解引用,而是直接去代码段找到了函数的地址。
冷知识:
如果没有成员变量,只有成员函数又或者都没有的情况,类的大小是多少呢?

这两种的情况,类的大小都规定是1,因为如果一点空间都不给,就无法证明这个类存在过。
this指针:
所有成员函数都i有一个隐含的this指针,它是成员函数的第一个参数。
该指针指向该对象,也就是说改类里的所有成员都可以通过this指针访问。
举个简单的例子:
原本我们的类是这样的:

但当编译器翻译过后就会先变成这样:

注意我们不能显示写this,不然会报错,和上图一样。
this指针被const了无法被修改,可以注意一下const的位置,补充一个小知识点:
const在*前 修饰指针指向的内容
const在*后 修饰指针本身
其实根据它的作用也可以判断出,可以用过this指针修改指向的内容,但不能修改指针本身。
它在函数内部是可以使用的,如下图:

this指针特性总结:
1.在形参和实参的位置我们不能显示写(别跟编译器抢活)
2.它在函数内部可以使用
3.const了,无法修改指针本身
4.因为它是所有成员函数的第一个参数,所有成员函数参数的个数永远都是n+1个
面试中this指针常考问题:
1.this指针存在哪里?
在堆?栈?常量区?静态区?对象里面?
首先对象里面肯定排除,因为我们刚才计算类的大小的时候通过测试,并没有计算this指针的大小,所以排除对象里面。
再排除堆,因为只有malloc的空间才会在堆里面。
还可以排除静态区,因为只有static和全局变量才在静态区。
继续排除常量区,因为在c++中const的变量不在常量区
所以正确答案:栈 因为this指针是一个形参,而栈是用来存放 函数的返回地址、形参、局部变量、返回类型的。
2.下面代码的能正常运行吗?

正确答案是,程序奔溃,这里找到Print函数可以直接去代码段找,但执行该函数时,需要访问里面的_a,所以对s1进行了访问,而s1是空指针,这里出现了对空指针的解引用,所以程序奔溃。

类和对象上篇到此结束,中篇和下篇我会陆续发布,可以点我主页查看,宝藏博主,还不关注,干货满满,火速收藏!!!
相关文章:
c++类和对象新手保姆级上手教学(上)
前言: c其实顾名思义就是c语言的升级版,很多刚学c的同学第一感觉就是比c语言难学很多,其实没错,c里的知识更加难以理解可以说杂且抽象,光是类和对象,看起来容易,但想完全吃透,真的挺…...
可变参数(c/c++)
目录 一、C语言版本 二、C的实现方法 2.1数据包 2.2sizeof...运算符 2.3可变参数模板的使用 2.4emplace_back() 有时候我们在编写函数时,可能不知道要传入的参数个数,类型 。比如我们要实现一个叠加函数,再比如c语言中的printf,c中的emp…...
【数据结构】图
文章目录 图1.图的两种存储结构2.图的两种遍历方式3.最小生成树的两种算法(无向连通图一定有最小生成树)4.单源最短路径的两种算法5.多源最短路径 图 1.图的两种存储结构 1. 图这种数据结构相信大家都不陌生,实际上图就是另一种多叉树&…...
32.3K Star,再见 Postman,这款开源 API 客户端更香
Hi,骚年,我是大 G,公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 使用 API 工具来调试接口是后端开发经常会使用的,之前一直…...
Python循环语句——continue和break
一、引言 在Python编程中,循环是常见的控制流语句,它允许我们重复执行一段代码,直到满足某个条件为止。而在循环中,continue和break是两个非常重要的控制语句,它们可以帮助我们更加灵活地控制循环的行为。 二、contin…...
C++面向对象程序设计-北京大学-郭炜【课程笔记(三)】
C面向对象程序设计-北京大学-郭炜【课程笔记(三)】 1、构造函数(constructor)1.1、基本概念 2、赋值构造函数2.1、基本概念2.1、复制构造函数起作用的三种情况2.2、常引用参数的使用 3、类型转换构造函数3.1、什么事类型转换构造函…...
Linux:搭建docker私有仓库(registry)
当我们内部需要存储镜像时候,官方提供了registry搭建好直接用,废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…...
用HTML、CSS和JS打造绚丽的雪花飘落效果
目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetGBK"><style>* {margin: 0;padding: 0;}#box {width: 100vw;heig…...
订餐|网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)
网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 (1)用户注册界面 (2)用户登录界面 (3)菜品详情界面 (…...
从零开始学howtoheap:解题西湖论剑Storm_note
how2heap是由shellphish团队制作的堆利用教程,介绍了多种堆利用技术,后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境:从零开始配置pwn环境:从零开始配置pwn环境:优化pwn虚拟机配置支持libc等指…...
Rust 基本环境安装
rust 基本介绍请看上一篇文章:rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup,可以轻松地安装 Rust 编译器(rustc)、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台,以及…...
【电源】POE系统供电原理(二)
转载本博客文章,请注明出处 上一篇文章中,有提到POE系统工作原理及动态检测机制,下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成,如下图所示。 图1 POE供电系统 PSE控制器的主要作用ÿ…...
GPU独显下ubuntu屏幕亮度不能调节解决方法
GPU独显下屏幕亮度不能调节(假设你已经安装了合适的nvidia显卡驱动),我试过修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash acpi_backlightvendor" ,没用。修改和xorg.conf相关的文件,…...
Linux篇:网络基础1
一、网络基础:网络本质就是在获取和传输数据,而系统的本质是在加工和处理数据。 1、应用问题: ①如何处理发来的数据?—https/http/ftp/smtp ②长距离传输的数据丢失的问题?——TCP协议 ③如何定位的主机的问题&#…...
RK3568笔记十七:LVGL v8.2移植
若该文为原创文章,转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客: LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台:rk3568 2、开发板:…...
C#系列-C#访问MongoDB+redis+kafka(7)
目录 一、 C#中访问MongoDB. 二、 C#访问redis. 三、 C#访问kafka. C#中访问MongoDB 在C#中访问MongoDB,你通常会使用MongoDB官方提供的MongoDB C#/.NET Driver。这个驱动提供了丰富的API来执行CRUD(创建、读取、更新、删除&#x…...
(12)Hive调优——count distinct去重优化
离线数仓开发过程中经常会对数据去重后聚合统计,count distinct使得map端无法预聚合,容易引发reduce端长尾,以下是count distinct去重调优的几种方式。 解决方案一:group by 替代 原sql 如下: #7日、14日的app点击的…...
记录 | 验证pytorch-cuda是否安装成功
检测程序如下: import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell,运行情况如下...
LeetCode 239.滑动窗口的最大值 Hot100 单调栈
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输…...
463. Island Perimeter(岛屿的周长)
问题描述 给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] 1 表示陆地, grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
