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

[C++]类与对象(上)

目录

 💕1.C++中结构体的优化

 💕2.类的定义

💕3.类与结构体的不同点

💕4.访问限定符(public,private,protected)

 💕5.类域

💕6.类的实例化 

💕7.类的字节大小

💕8.类的字节大小特例

 💕9.this指针


  

 (最新更新时间——2025.1.14,更新内容 目录9)

因为困难多壮志,不教红尘惑坚心

        今身暂且栖草头,他日狂歌踏山河

 💕1.C++中结构体的优化

在C++中,结构体的使用得到了优化,具体优化了什么呢?请看以下代码->:

struct student
{int age;double num;
};int main()
{struct student s1;//C语言中书写,C++也兼容student s1;//C++中优化return 0;
}

我们在C语言中书写时,需要把struct把写上,而在C++中得到了优化,不需要写struct,直接写结构体的名称也可以使用


同时我们也可以在struct中定义函数

struct student
{int age;double num;int add(int a, int b){return a + b;}
};int main()
{student s1;//C++中优化cout<<s1.add(10, 20);//输出30return 0;
}


 💕2.类的定义

我们回到正题,什么是类?

类其实就是结构体的优化,我们将struct 更改为 class,就属于变为了类


先看一段代码,在这串代码中,class 是类的关键字,student 是类的名字

{ }为类的主体,类中的变量称为类的属性或成员变量,

class student
{    //类的⽅法或者成员函数int add(int a, int b){return a + b;}//类的属性或者成员变量int age;double num;
};int main()
{student s1;//创建类变量s1
}

就此看来,类与结构体还没有不同点,那么不同点在哪呢?

💕3.类与结构体的不同点

类中的成员函数是与成员变量密切相关的,即同一类中,成员函数可以给成员变量赋值,并且成员变量也可以作为成员函数的参数,我们举个例子->:

如图所示,即使我们不进行传参,成员函数内也可以找到类中对应的成员变量,而结构体却不可以

因此->:在类中创建的成员变量,在类中是直接可以用的

💕4.访问限定符(public,private,protected)

在C++中,类的定义中新建了三种权限关系,分别是public,private,与protected

这些的意义是什么呢?


C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限

选择性的将其接⼝提供给外部的⽤⼾使⽤

public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别,接下来是代码举例->:

我们可以发现,我们在类中的成员函数设置为private,只可以在类的内部使用,那么在类的外部就不能使用这些成员函数,这就是private的作用


那如果把它换成public呢?

效果如下->:更换成public后,权限被更改为公有的,在类外面也可以进行使用


如果我们访问限定符什么都不写的话,系统会默认全部设为private


 💕5.类域

讲类域之前,我们先讲一个简单的例子

class student
{int age;int year;
};
int main()
{}

这是的类叫做类的声明还是定义?


答案是声明,类的定义是会开创出空间的,而此时的类没有任何的变量并不会开创空间,所以此时叫做类的定义,那既然是类的定义,那可不可以写在 .h 文件中,答案是可以的,接下来请看代码->:


.h文件>:

#pragma once
#include<iostream>
#include"abc.h"
using namespace std;class Date{
public:void Init(int year, int month, int day);int _year;int _month;int _day;
};

我们可以在.h中实现类的声明,那类中成员函数的实现怎么办,我们以往的经验是写在函数功能实现的.c文件中,在C++中也是一样的,只不过有一点不同


函数实现文件.c->:

#define _CRT_SECURE_NO_WARNINGS 
#include"achie.h"void Date:: Init(int year, int month, int day)
{_year = year;_month = month;_day = day;
}

在这些代码中,我们看到了类中成员函数的实现,有许多人都会注意到了 Date:: ,这是什么意思?这是因为类域的存在,我们知道函数的实现依靠的是函数的地址,而编译器寻找的方式是全局域,局部域,命名作用域与类域,我们的Init写在了类域中,编译器在全局域与局部域都找不到,而命名作用域与类域都是需要特殊指定的域,所以如果不声明编译器就找不到这个函数在哪,我们可以试一下不指定后的样子:


以下分别是.h与函数实现的.c文件中的图片,可以看到.h中说明找不到函数的定义,因为在函数实现.c文件中,并没有找到Init函数的地址

💕6.类的实例化 

类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间
⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。打个⽐ ⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多 少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房 ⼦才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。

一个类可以实例出多个对象的代码演示->:

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;class Date {
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};int main()
{Date a1;Date a2;Date a3;
}

这里就是类与对象的关系,一个类可以有多个对象,如果有拿这段代码去运行而报错的同志,那就是因为对象创建出来后没有手动初始化,注意是手动(后面讲)

💕7.类的字节大小

类的字节大小是怎么计算的,其实与我们在C语言中学的结构体极其类似,具体在哪不同,我们接着看->:

我们可以看到是12个字节,为什么?

其实这里与我们在C语言中学习的结构体内存存储方式基本相同,如果不懂的具体请看这篇文章,我们这里只讲不同点->:

C语言结构体详解(超全)简单易懂(代码+万字文字+画图讲解)


不同点在于->:当我们计算类的字节大小时,我们会思考,类中的函数存储在哪?

⾸先函数被编译后是⼀段指令,对象中没办法存储,因此这些指令存储在⼀个单独的区域(代码段)

也就是说明类中的成员函数存储在公共代码区,这也意味着每个对象所使用的函数是共同的,并不会因为每有一个类就创建一个它自己的函数,它与其他对象所使用的函数是共同的


我们知道,函数的使用是相当频繁地,如果一个对象使用100次函数,那么创建出来的空间是非常大的,因此函数的地址会存放在公共代码区,避免空间重复,浪费空间


注意->:对象中的每个成员变量是独立的成员变量

💕8.类的字节大小特例

为什么输出的字节是1呢?

类中的成员变量为空,不应该输出0吗?

其实这个1字节是为了识别出类而开辟的,所以是1


那这样呢?

这样输出的1跟之前所输出1的原因是相同的,都是为了识别出类的存在

 💕9.this指针

在类中的每一个成员函数中,其实都有一个隐藏的 this 指针,什么是隐藏的 this 指针?

当我们调用类中的成员函数时,会将这个对象的地址传输过去,什么意思?请看代码->:

在我们调用函数时,就会将对象的地址传输过去,并在成员函数的形参处用Date* const this来接受,为什么会报错?这是因为->:


C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内使⽤this指针,什么意思?请看下图->:


这里的this可以写也可以不写,主要是为了演示一遍,这里的this指的就是对象a1的地址


小题思考->:

我们思考一下,下面这串代码的运行结果是什么->:

#include<iostream>
using namespace std;
//A.编译报错 B.运行崩溃 C.正常运行
class A
{
public:void Print(){cout << "A::Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

其实是正常运行,在这里传递的是p,也就是一级指针,传空指针是没有问题的,空指针只有在解引用时候才会报错,而这里并没有进行解引用,也就是说会正常运行


再来看一道
 

#include<iostream>
using namespace std;
//A.编译报错 B.运行崩溃 C.正常运行
class A
{
public:void Print(){cout << "A::Print()" << endl;cout << _a << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

这道题就不会正常运行了,而是运行崩溃,因为从语法上看,this->a 等价于 (*this).a。这里的 *this 就是对 this 指针的解引用,它获取了 this 所指向的对象本身,然后通过 . 操作符访问该对象的成员变量 a

空指针被解引用了,所以运行崩溃了


最后一道思考->:

3. this指针存在内存哪个区域的 ()
A. 栈 B.堆 C.静态区 D.常量区 E.对象⾥⾯

这里的答案是栈区,因为this指针是形参,而形参是存储在栈区的

相关文章:

[C++]类与对象(上)

目录 &#x1f495;1.C中结构体的优化 &#x1f495;2.类的定义 &#x1f495;3.类与结构体的不同点 &#x1f495;4.访问限定符(public,private,protected) &#x1f495;5.类域 &#x1f495;6.类的实例化 &#x1f495;7.类的字节大小 &#x1f495;8.类的字节大小特例…...

大数据技术实训:Zookeeper集群配置

一、本地模式安装部署 1&#xff09;安装前准备 &#xff08;1&#xff09;安装jdk &#xff08;2&#xff09;拷贝Zookeeper安装包到Linux系统下 &#xff08;3&#xff09;解压到指定目录 tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/ 2&#xff09;配置修改 &am…...

HTML5 加载动画(Loading Animation)

加载动画&#xff08;Loading Animation&#xff09;详解 概述 加载动画是指在数据加载过程中&#xff0c;向用户展示的一种视觉效果&#xff0c;旨在提升用户体验&#xff0c;告知用户系统正在处理请求。它可以减少用户的等待焦虑感&#xff0c;提高界面的互动性。 常见的加…...

C语言进阶-2指针(一)

目录 1. 字符指针1.1 一般用法&#xff1a;字符指针指向单字符1.2 第二种用法&#xff0c;字符串首地址给指针变量1.3 习题,下面代码的输出结果是什么&#xff1f;为什么&#xff1f; 2. 指针数组2.1实例—— 字符指针数组2.2实例——整形指针数组2.3 例子&#xff0c;识别下下…...

【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南

对象检测是计算机视觉领域的核心任务之一&#xff0c;广泛应用于视频监控、自动驾驶、智能安防等多个场景。随着深度学习技术的发展&#xff0c;基于传统方法的对象检测逐渐被基于神经网络的先进模型所取代。本文将系统地介绍如何使用Python进行对象检测&#xff0c;重点探讨了…...

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下&#xff0c;你面前有一堆杂乱无章的数据&#xff0c;你需要从中找到特定的信息&#xff0c;或者按照一定的规则对这些数据进行排序。又或者&#xff0c;你要为一个物流公司规划最佳的配送路线&#xff0c;以降低成本和提高效率。这些问题看似复杂&#xff0c;但都可以…...

Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)

索引是数据库中用于加速查询操作的重要机制。通过索引&#xff0c;MySQL可以快速定位到满足查询条件的数据行&#xff0c;而不需要扫描整个表。合理的索引设计可以显著提高查询性能&#xff0c;但不合理的索引可能会导致性能下降和磁盘空间浪费。因此&#xff0c;理解索引的工作…...

matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等

%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…...

systemd-networkd NetworkManager 介绍

systemd-networkd 和 NetworkManager 的详细介绍 systemd-networkd 和 NetworkManager 都是 Linux 系统中常用的网络管理工具&#xff0c;但它们的设计目标和使用场景不同。以下是它们的详细介绍、功能、使用场景和差异。 1. systemd-networkd systemd-networkd 是一个由 syst…...

本地部署项目管理工具 Leantime 并实现外部访问

Leantime 是一款开源 AI 项目。它可以在本地直接运行大语言模型 LLM、生成图像、音频等。直接降低了用户使用AI的门褴。本文将详细的介绍如何利用 Docker 在本地部署 Leantime 并结合路由侠实现外网访问本地部署的 Leantime 。 第一步&#xff0c;本地部署安装 Leantime 1&am…...

PHP cURL 函数初学者完全指南

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

C#中的Array数组,List集合和ArrayList集合--07

目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…...

硬件实用技巧:TPS54331DR横杠标识识别1引脚

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…...

自然语言处理基础:全面概述

自然语言处理基础&#xff1a;全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...

网络安全的几种攻击方法

攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里&#xff0c;以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法&#xff0c;将EXE可执行程序或者DLL动态连接库文件的编码进行改变&#xff08;比如实现压缩、加密&a…...

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…...

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法&#xff1a; 第一步&#xff1a;安装distutils&#xff0c;在CMD命令行输入&#xff1a; python -m ensurepip --default-pip第二步&#xff1a;检查和安装setuptools和wheel&#xff1a; python -m pip install --upgrade …...

C++ QT 自绘表盘

文章目录 效果图代码 效果图 代码 代码没什么好说的&#xff0c;直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...