C++类和对象,初见类
坚持看完,结尾有思维导图总结
这里写目录标题
- C语言和 C++ 的区别
- 类的定义
- 类的初认识
- 类的内容
- 访问限定符
- 类的作用域
- 类的实例化
- 类中的 this 指针
- 总结
C语言和 C++ 的区别
C++ 的祖师爷除了在 C语言的基础上化简了一些复杂操作
更为重要的是,两个语言实现的过程是不一样的
C 语言是一种面向过程的语言,而 C++ 是一种面向对象的语言
如果是洗衣服
C 语言会这样洗
那盆子,放水,放衣服,加洗衣粉,手搓,晾干
而 C++ 会先分析有哪些对象
会有 人 衣服 洗衣机 洗衣粉
通过这些对象的交互完成洗衣服
人只要做把衣服放进洗衣机,加洗衣粉,打开洗衣机就可以
不需要关注衣服是怎么洗的
类的定义
类的初认识
上面我们如果是用 C 语言来写,就要定义一个盆子,然后放水是一个函数
放衣服是一个函数,加洗衣粉是一个函数,手搓衣服是一个函数,晾干是一个函数
然后一步步地走
但是 C++ 不同
他会把人 衣服 洗衣粉 洗衣机分别定义成一个个的类
人有哪些特性,功能,归到人这个类里面
衣服有哪些特性功能,归到衣服这个类中
洗衣机有哪些特性功能,归到洗衣机这个类中
我们很自然地联想到,一个自定义的类型,在 C语言中我们常使用结构体定义
struct 但是 在 C 语言里面,结构体内部并不支持函数
然而在 C++ 中,我们可以在结构体里头写函数了 ,这样于 c语言结构体类似但是不同的东西 我们把他叫做类
类的定义是这样的
class Name
{
//成员函数和成员变量
};// 注意分号
类的内容
类中的内容可以分成两类,一类是 成员变量 , 一类是成员函数
如果我们认识一个人,我们能知道这个人是谁,叫什么名字,是什么性别
class Person
{
//成员函数
public:void personinfo(){cout << _name << ' ' << _age << ' ' << _sex << endl;}
// 成员变量
private:char* _name;int _age;char* _sex;
};
这里的实现是声明和定义放在一起的
有时候,类中声明和函数放在一起的情况,编译器可能会把成员函数看做是内联函数
如果我们想要把声明和实现分离
在实现的位置,一个是不要忘记头文件的应用
在引用完头文件后,要说明实现的函数属于哪一个类,这里是类的作用域的问题
声明则放在类里面
访问限定符
有一件奇怪的事情
为什么成员变量前面要加上 private 而 成员函数前面要加上 public
这里就设计到访问限定符的问题
我们都用过洗衣机,也大概都知道怎么用洗衣机
就那几个按钮的事情对吧
我们不会为了使用洗衣机去研究洗衣机的结构
类也是这样,除了设计者
使用的人只要会用成员函数就可以了,并不会去关注成员变量有哪些
public 变式公共的 ,能够为外界调用
private 表示私人,就是不能被类之外的操作访问,但是类内的函数(成员函数)是可以访问的
那我们就能够调用 public 的函数来间接按照特定的方式访问 private 的成员
还有 一个访问限定符 叫 protected 因为是 简略说明 ,所以暂时不介绍
其中需要注意的是
class的默认访问权限为private,struct为public(因为struct要兼容C)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止, 如果后面没有访问限定符,作用域就到 } 即类结束。
而这种通过访问权限,隐藏类的成员变量结构,显示类的访问方式的做法,就是封装
就好像是洗衣机内部被洗衣机外壳包起来,我们看不到内部结构的方式,就是封装
而封装是面向对象 的三大特性之一
类的作用域
之前在初识C++ 中,我们说为了防止多个程序员使用同名变量,同名函数
我们可以用不同的作用域,来圈定哪些变量属于程序员 A ,哪些变量属于程序员 B
而当我们定义一个类的时候,会自动生成一个类的作用域
不同的类是可以使用同名函数和变量的,使用类的作用域能够很好地应对这种情况
因为成员变量已经在类里面了不用再表明属于哪一个类
而当函数声明和实现分离时,在实现函数的时候,必须指明属于哪一个类,防止实现的混淆
类的实例化
前面我们解决的是类的声明的问题
类的声明,就好像把动物分成一个个种类,比如像熊猫,这是一类动物
但是其中的每一只熊猫都有自己的特征,自己的名字等
这种就叫做实例化
在计算机中,我们说类有 成员函数,成员变量,都是类的声明
而在使用中调用的类,才是类的实例化
我们可以简单理解为为类开空间就是类的实例化
既然为类开空间了,那就说明有空间大小
空间大小是如何计算呢?
尤其是一个类中有成员函数,整个类大大小计算更加奇怪了
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:void DateInit(Date& date, int year = 1, int month = 1, int day = 1);
private:int _year;int _month;int _day;
};void Date::DateInit(Date& date,int year,int month,int day)
{date._year = year;date._day = day;date._month = month;
}int main()
{Date d1;d1.DateInit(d1,2023,2,14);cout << sizeof(d1) << endl;return 0;
}
我定义了一个日期类,其中内部成员有年月日
通过计算大小,发现
计算大小是 12 ,说明 ---- 内部只给内部成员开辟了空间,但是没有给函数开辟空间
那函数的空间开辟到哪里去了呢?
实际上,类的空间开辟,是这样的
事实上,每一个成员虽然不同,但是调用的成员函数传递的参数都是一样的
也就是说,对于类的成员函数来说
每个类只要把成员函数需要的参数传给我就可以了
成员函数是不管你是哪一个成员
我们在观察一下对应的汇编代码
可以看到调用的是同一个函数
既然编译器都帮你对应的函数调用转换了,和调用一个普通函数差不多
又何必开辟空间储存对应的函数指针甚至是整个函数栈帧呢,答案是没有必要浪费这个空间
但是要注意的是,如果实例化一个空类(一个没有内容的类)
他的空间大小是 1 ,用来占位
类中的 this 指针
在类的成员函数中,我们可以这样写初始化函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;class Date
{
public:void Init(int year,int month,int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2023,2,16);return 0;
}
在调试中我们能够看到 d1 被初始化为 2023 2 16
但是传参中,我可是没有传递任何与 d1 相关的参数
只是之前的 d1.Init 指定了一下而已
成员函数是怎么样找到 d1 然后将 d1 初始化的呢?
实际上,编译器会自动帮我们传递一个 this 指针 的参数交给成员函数
这个 this 指针始终指向 调用这个成员函数的对象
比如我们 d1.Init 调用 Init 成员函数
编译器会把 this 指针传参
然后对应的成员 变成 this->成员 的解引用
但是我们不能直接把 this 指针当成一个参数写在函数上面
如果这样写,编译器会传递自己在函数自动传参的 this 指针
但是 用户写的 this 这个形参的坑就没有人填了,导致形参数量过多,出现问题
总结
希望大家看完,能够有所
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容
相关文章:

C++类和对象,初见类
坚持看完,结尾有思维导图总结 这里写目录标题C语言和 C 的区别类的定义类的初认识类的内容访问限定符类的作用域类的实例化类中的 this 指针总结C语言和 C 的区别 C 的祖师爷除了在 C语言的基础上化简了一些复杂操作 更为重要的是,两个语言实现的过程是…...

Redis常用数据结构及应用场景
1.总体结构 Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…...
C++虚继承内存布局
C菱形继承内存布局 编译器:Visual Studio 2019 关于如何查看内存布局 B class B { public:B(): _ib(10), _cb(B){cout << "B()" << endl;}B(int ib, char cb): _ib(ib), _cb(cb){cout << "B(int,char)" << endl;}vi…...

IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析
IO基本概述 IO的分类 IO以不同的维度划分,可以被分为多种类型;从工作层面划分成磁盘IO(本地IO)和网络IO; 也从工作模式上划分:BIO、NIO、AIO;从工作性质上分为阻塞式IO与非阻塞式IO;…...

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速
从去年开始,Zebec 就开始以多链的形式来拓展自身的流支付生态,一方面向更多的区块链系统拓展自身流支付协议,即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署,且能够在这些EV…...

wpscan常见的使用方法
目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安…...
Tree 底层源码实现(二叉树、递归、迭代)
树(Tree)是一种非线性数据结构,由一组节点和它们之间的边组成。在树中,每个节点都有零个或多个子节点,除了根节点外,每个节点都有且仅有一个父节点。树可以被用于许多应用程序,如文件系统、XML文…...

家政服务小程序实战教程13-接入客服
小程序在微信里使用,以其无需安装随用随走为特点。但是有个问题是,如果提供商品或者服务的,用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求,就需要我们提供客服接入的功能,用户可以点击客服图标…...

大白话高并发(三)
背景 高并发得第三篇,讲一讲压测吧,因为我的目的是模拟100万人同时来秒杀。 是不是真的要找100万个人 没必要 ,你就算100万人掐着表在同一毫秒内把请求请求某一台机器,服务器也不可能在同一时间处理那么多请求,因为…...

vue全家桶(四)前端工程化
vue全家桶(四)前端工程化1.模块化的相关规范1.1模块化概述1.2模块化的分类A.浏览器端的模块化B.服务器端的模块化C.ES6模块化1.2.1 Node.js中通过bable体验ES6模块化1.2.2 ES6模块化的基本语法1.2.2.1 默认导出与默认导入1.2.2.2 按需导出与按需导入1.2.…...
超螺旋滑模控制(STA)
超螺旋滑模控制(Super Twisting Algorithm, STA) 超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。 系统模型 对于二阶系统可以建立具有标准柯西形式的微分方程组 {x˙1x2x˙2fg⋅u\begin{cases} \dot x_1 x_2 \\ \dot x_2 f g \cdo…...

NX二次开发编译时dll自动数字签名及拷贝
前言 在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 一、基于C# 开发签名 1、添加资源文件 (1)项目类库上右键–>属性–>资源–>添加资源右边小三角–>添加现有文件–>切换到UG安装目录下…...

教你如何搭建人事OA-薪资管理系统,demo可分享
1、简介1.1、案例简介本文将介绍,如何搭建人事OA-薪资管理。1.2、应用场景根据设置薪资基础及考勤和绩效的数据计算得到各个员工工资详情。2、设置方法2.1、表单搭建1)新建表单【工资表】,字段设置如下;名称类型名称类型人员资料分…...

ChIP-seq 分析:Mapped 数据可视化(4)
1. Mapped reads 现在我们有了 BAM 文件的索引,我们可以使用 idxstatsBam() 函数检索和绘制映射读取的数量。 mappedReads <- idxstatsBam("SR_Myc_Mel_rep1.bam")TotalMapped <- sum(mappedReads[, "mapped"])ggplot(mappedReads, aes(x…...

Jenkins 基于Kubernetes 弹性构建池
流程:创建Jenkins Agent;获取Jenkins Agent的参数;渲染yaml模板;调用K8s API在固定的NS中创建一个Pod;运行Jenkins pipeline到agent;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…...

经典算法题---链表奇偶重排(好题)双指针系列
我听别人说这世界上有一种鸟是没有脚的,它只能够一直的飞呀飞呀,飞累了就在风里面睡觉,这种鸟一辈子只能下地一次,那一次就是它死亡的时候。——《阿甘正传》这一文章讲解链表的奇偶排序问题,这是一道不难但是挺好的链…...

数据仓库实战
目录1、最佳实战1.1 表的分类1.2 ETL策略1.3 任务调度2、项目实战2.1 项目概述2.2 数据描述2.3 架构设计2.4 环境搭建2.5 项目开发1、最佳实战 1.1 表的分类 维度建模中表的类型:事实表和维度表 事实表又可以分为:事务事实表、周期快照事实表、累积快照…...

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)
😄 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构:1.2、范式:预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式:预…...

ASE12N65SE-ASEMI高压MOS管ASE12N65SE
编辑-Z ASE12N65SE在ITO-220AB封装里的静态漏极源导通电阻(RDS(ON))为0.68Ω,是一款N沟道高压MOS管。ASE12N65SE的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。ASE…...
centos8防火墙命令配置(开放端口)
查看防火墙状态:(root用户)firewall-cmd –state启动防火墙:(root用户)systemctl start firewalld.service查看防火墙开放端口:(root用户) firewall-cmd --list-ports …...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...