当前位置: 首页 > news >正文

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、用户功能模块的实现 &#xff08;1&#xff09;用户注册界面 &#xff08;2&#xff09;用户登录界面 &#xff08;3&#xff09;菜品详情界面 &#xff08…...

从零开始学howtoheap:解题西湖论剑Storm_note

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…...

Rust 基本环境安装

rust 基本介绍请看上一篇文章&#xff1a;rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup&#xff0c;可以轻松地安装 Rust 编译器&#xff08;rustc&#xff09;、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台&#xff0c;以及…...

【电源】POE系统供电原理(二)

转载本博客文章&#xff0c;请注明出处 ​ 上一篇文章中&#xff0c;有提到POE系统工作原理及动态检测机制&#xff0c;下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成&#xff0c;如下图所示。 图1 POE供电系统 PSE控制器的主要作用&#xff…...

GPU独显下ubuntu屏幕亮度不能调节解决方法

GPU独显下屏幕亮度不能调节&#xff08;假设你已经安装了合适的nvidia显卡驱动&#xff09;&#xff0c;我试过修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash acpi_backlightvendor" &#xff0c;没用。修改和xorg.conf相关的文件&#xff0c;…...

Linux篇:网络基础1

一、网络基础&#xff1a;网络本质就是在获取和传输数据&#xff0c;而系统的本质是在加工和处理数据。 1、应用问题&#xff1a; ①如何处理发来的数据&#xff1f;—https/http/ftp/smtp ②长距离传输的数据丢失的问题&#xff1f;——TCP协议 ③如何定位的主机的问题&#…...

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章&#xff0c;转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客&#xff1a; LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台&#xff1a;rk3568 2、开发板:…...

C#系列-C#访问MongoDB+redis+kafka(7)

目录 一、 C#中访问MongoDB. 二、 C#访问redis. 三、 C#访问kafka. C#中访问MongoDB 在C#中访问MongoDB&#xff0c;你通常会使用MongoDB官方提供的MongoDB C#/.NET Driver。这个驱动提供了丰富的API来执行CRUD&#xff08;创建、读取、更新、删除&#x…...

(12)Hive调优——count distinct去重优化

离线数仓开发过程中经常会对数据去重后聚合统计&#xff0c;count distinct使得map端无法预聚合&#xff0c;容易引发reduce端长尾&#xff0c;以下是count distinct去重调优的几种方式。 解决方案一&#xff1a;group by 替代 原sql 如下&#xff1a; #7日、14日的app点击的…...

记录 | 验证pytorch-cuda是否安装成功

检测程序如下&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell&#xff0c;运行情况如下...

LeetCode 239.滑动窗口的最大值 Hot100 单调栈

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…...

463. Island Perimeter(岛屿的周长)

问题描述 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...