前言

本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~
第3篇主要讲的是有关于C++的类的定义访问限定符类域类的实例化this指针
C++才起步,都很简单呢!

目录

前言

基本语法

访问限定符

基本语法

类域

类的实例化 

内存对齐规则

this指针

封装(初步了解)


class为类的关键字,后跟类名,{ }中为类的主体。主体中内容称为类的成员类中的变量称为类的属性或者成员变量类中的函数称为方法或者成员函数

基本语法

为了区分方法的形参和类中的成员变量,通常会在变量前后加一个下划线,具体怎么标识,看公司或者团队要求。

//类与对象
class Stack
{//方法void Init(int capacity = 4){_array = (int*)malloc(sizeof(int) * capacity);if (nullptr == _array){perror("malloc申请空间失败!\n");return;}_capacity = capacity;_top = 0;}void Push(int x){//扩容步骤(省略)_array[_top++] = x;}//·······(省略栈的各种函数)//成员变量int* _array;size_t _capacity;size_t _top;
};
//类名就是类型

类中的成员函数,默认为inline函数

访问限定符

public公有,在类外可以直接被访问。设计时成员函数一般是公有的。
private私有,在类外不能直接被访问。设计时成员变量一般是私有的。
protect保护,在类外不能直接被访问。在继承上,和private有区别(在继承详细说明)。

基本语法

class Stack
{
//公有
public:void Init(int capacity = 4){_array = (int*)malloc(sizeof(int) * capacity);if (nullptr == _array){perror("malloc申请空间失败!\n");return;}_capacity = capacity;_top = 0;}
//私有
private:int* _array;size_t _capacity;size_t _top;
};

如上,跟在不同的访问限定符后,受不同的访问限定。

 
C++兼容C语言的struct,同时又升级了struct。
C++中,struct和类的唯一区别在于:struct的成员变量和方法默认为publicclass默认为private为求严谨,最好自己指明访问限定符

//不加访问限定符,默认为public
struct Person
{void Init(const char name[5]){strcpy(_name,name);}void Print(){cout << "姓名:" << _name << endl;}char _name[5];
};int main()
{//可在外部直接使用Person p1;p1.Init("张三");p1.Print();return 0;
}

类域

由类定义的一个新的作用域,类的所有成员都在类域中。类域使得不同的类可以有同名的成员。和命名空间类似,它影响的是编译器的查找顺序规则(具体去看我博客内的C++第一篇喔~)。

成员函数可以进行声明和定义的分离。
一般我们将声明放在类中,定义放在另一个文件中。并且为了标识该方法所属的类,需要用到域作用限定符  :: 

void Stack::Init(int capacity)//注意定义处不要写缺省参数,缺省参数写在声明
{//函数实现省略···
}

类的实例化 

类中的成员变量在没有实例化时,均不开辟空间,只是一个声明。我们要将类实例化成对象后,它才能够存储数据,我们才能对具体的对象进行操作

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;//实例化出对象d1Date d2;//实例化出对象d2d1.Init(2025, 7, 20);d2.Init(2025, 7, 25);d1.Print();d2.Print();cout << sizeof(d1) << endl;//输出12,成员变量共12个字节cout << sizeof(d2) << endl;//输出12,成员变量共12个字节return 0;
}

实例化后,对象只存储成员变量,不存储方法指针。因为同一类的对象使用的是相同的方法,所以将方法存储在公共代码区即可,不存储在实例对象里。否则,会重复存储,浪费空间。

内存对齐规则

成员变量存储,遵循C语言的内存对齐规则。

第一个成员变量在类起始地址偏移量为0处。
②其他成员变量要对齐到对齐数的整数倍地址处
对齐数 = 编译器默认对齐数 与 该成员大小 的较小值
④VS编译器默认的对齐数是8
⑤类的总大小为默认对齐数的整数倍
⑥类中没有成员时(如仿函数类),总大小为1byte。即使没有也要开辟空间占位,以表示存在实例对象。

内存对齐的目的方便读取,读取数据时可以从在数据类型大小的整数倍位置读取,不用一字节一字节读,而是跳跃读取找到位置后可以一次性读取,不用再一个字节一个字节拼起来。

this指针

用于指明类方法中区分访问的成员方法。类方法存储在公共代码区,在类方法的角度来看,调用它时,该方法并不清楚是哪个对象调用的它。这就要用到this指针。

类方法中实际上还会隐含一个参数,

void Init(int year, int month, int day)
{//略···
}//在形参列表首位,存在一个省略的参数this指针
void Init(Date* const this, int year, int month, int day)
{//略···
}

我们可以看到有const修饰,该隐藏参数是不可以修改的
调用时,会传入调用方法的对象的地址作为this指针

d1.Init(2025, 7, 21);
//d1.Init(&d1, 2025, 7,21);
//实际上是这样传参的,但是不能这样写

 C++编译器会自动添加的隐含的this,程序员不可以自行添加,会报错。但是可以在函数体内添加使用

void Print()
{cout << _year << "/" << _month << "/" << _day << endl;
}
//等价于
void Print()
{cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
}

通过this指针,对象调用类方法时,才可以在类方法内访问对象的属性。

类指针的易错点:

class A
{
public:void Print(){cout << "Hi!" << endl;}
private:int _a;
};class B
{
public:void Print(){cout << "Hi!" << endl;cout << _b << endl;}
private:int _b;
};int main()
{//正常运行,输出“Hi!”A* pa = nullptr;pa->Print();//运行崩溃B* pb = nullptr;pb->Print();return;
}

如上,papb都是空指针
pa指针调用Print方法能正常运行,是因为运行时未对这个空指针进行解引用操作
pb指针调用Print方法会运行崩溃,是因为运行到语句 cout << _b << endl 时,_b前有隐藏的this指针,所以这里实际上有一个 this->_b ,这里的this即是传入的pb空指针,发生解引用错误
(“ 指针-> ”为解引用操作喔~)

ps:this指针的创建在栈区

封装(初步了解)

目的:C++将数据和函数放在类中,隐藏细节和复杂部分,只需要确保代码能实现目的即可。靠访问限定符,约束和管理程序员访问数据,避免细节上的错误

关于封装更多的知识,在之后还有更多可以学习的,敬请关注!!

❤~~本文完结!!感谢观看!!欢迎来我博客做客~~❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915486.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915486.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915486.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AD域控制器虚拟化的安全加固最佳实践

以下是AD域控制器虚拟化安全加固的7项核心实践&#xff0c;结合最新Windows Server 2022特性与虚拟化环境需求&#xff1a;基础架构强化‌ 采用静态IP分配并确保所有域控节点DNS指向主DC&#xff08;如192.168.1.10&#xff09;‌ 虚拟机模板需预配置林/域功能级别为Windows Se…

java解析nc气象数据

1.1pom.xml<dependency><groupId>edu.ucar</groupId><artifactId>netcdfAll</artifactId><version>5.4.1</version></dependency>1.2 netcdf使用/** param type 0 ,1, 2 wind 1 or 2 其他 0 .* return Map* */public Map i…

STC8H8K64U SKDIP28芯片频率占空比PWM波形

/****PWM输出任意周期占空比波形*******/ #include "STC8H.h" // #include "intrins.h" // #define uchar unsigned char // #define uint unsig…

【RK3576】【Android14】USB开发调试

获取更多相关的【RK3576】【Android14】驱动开发&#xff0c;可收藏系列博文&#xff0c;持续更新中&#xff1a; 【RK3576】Android 14 驱动开发实战指南 硬件接口 RK3576支持两个USB3.0控制器 驱动开发 dts配置 在“Android14/kernel-6.1/arch/arm64/boot/dts/rockchip/rk…

20. TaskExecutor与ResourceManager心跳

20. TaskExecutor与ResourceManager心跳 现在&#xff0c;需要回过头看 ResourceManager是如何产生心跳管理服务的。cluster.initializeServices 方法的 heartbeatServices createHeartbeatServices(configuration);产生一个 HeartbeatServicesImpljobmanager的 resourceManag…

OS19.【Linux】进程状态(上)

目录 1.情景引入 2.操作系统学科对进程状态的分类 运行状态 基于时间片的轮转调度算法 阻塞状态 等待IO设备的例子 等待其他进程中需要获取的数据 进程唤醒 挂起状态(全称为阻塞挂起状态) 简单谈谈虚拟内存管理 就绪状态 笔面试题 3.Linux对进程状态的分类 R和S状…

如何优雅地修改项目的 Android 版本(API 级别)

引言 在 Android 开发的日常迭代中&#xff0c;我们经常需要升级或降级项目的 minSdkVersion、targetSdkVersion 与 compileSdkVersion。升级可以解锁新特性和性能优化&#xff1b;降级则可能为了兼容旧机型或快速验证问题。本文将手把手演示在 Android Studio 里修改 Android …

GNU Radio多类信号多种参数数据集生成技巧

参考我的这篇博客&#xff0c;我想自制一个多信号数据集&#xff1a; 【多雷达信号硬件模拟】 3台USRP1台VSG信号发生器模拟多雷达信号&#xff0c;1台USRP产生高斯噪声模拟更多信道环境&#xff0c;1台USRP采集信号 需要在多个波段对四种信号进行参数设置&#xff0c;带宽有…

Ansible + Shell 服务器巡检脚本

脚本概述这是一个用于服务器日常巡检的 Shell 脚本&#xff0c;主要功能包括&#xff1a;检查多台主机的网络连通性 监控CPU、内存和磁盘使用率 生成详细的巡检报告 通过企业微信发送告警通知核心技术点1. 主机批量管理使用Ansible工具远程执行命令和脚本 通过主机…

Linux-rpm和yum

一、RPMRPM&#xff08;Red Hat Package Manager&#xff09;是一个用于管理 Red Hat 系列 Linux 发行版&#xff08;如 RHEL、CentOS、Fedora&#xff09;软件包的工具。RPM 允许用户以统一的格式来安装、卸载、升级和查询软件包。它是 .rpm 文件的主要工具&#xff0c;后缀名…

手推OpenGL相机的正交投影矩阵和透视投影矩阵(附源码)

概述计算OpenGL的正交投影矩阵和透视投影矩阵是有现成函数的。自己手推不是为了重复造轮子。手推一遍&#xff0c;可以极大的加强对这两个矩阵的理解。同时也可以满足一下自己求知欲。正交投影矩阵手推正交投影矩阵源码 WGMatrix4x4 WGMatrix4x4::BuildOrtho(double l, double …

【跨国数仓迁移最佳实践2】MaxCompute SQL执行引擎对复杂类型处理全面重构,保障客户从BigQuery平滑迁移

本系列文章将围绕东南亚头部科技集团的真实迁移历程展开&#xff0c;逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第二篇&#xff0c;跨国数仓迁移背后 MaxCompute 的统一存储格式创新。 注&#xff1a;客户背景为东南亚头部科技集团&#xff0c;…

react(基础篇)

React由Meta公司研发&#xff0c;用于构建Web和原生交互界面的库。 React 官方中文文档 查看JSX &#xff08;一&#xff09;React组件 用户界面的一部分&#xff0c;通俗的来讲&#xff0c;最小的元素组成的单元&#xff0c;可以实现部分逻辑与功能 房子的门就可以看成一个…

数据结构-哈希表(一)哈希函数、哈希表介绍、优缺点

哈希表 哈希函数哈希表使用了哈希函数来完成key到地址的快速映射&#xff0c;所以在了解哈希表之前&#xff0c;需要先明白哈希函数的概念和特点。 哈希函数的定义 哈希函数 哈希函数是一种将任意长度输入的数据&#xff0c;转换成固定长度输出的算法哈希函数H可以表示为yH(x) …

Shader开发(一)什么是渲染

前言在现代游戏开发和计算机图形学领域&#xff0c;渲染技术是连接虚拟世界与视觉呈现的关键桥梁。无论你是刚接触图形编程的新手&#xff0c;还是希望深入理解渲染原理的开发者&#xff0c;掌握渲染的核心概念都是必不可少的第一步。什么是渲染&#xff1f;渲染&#xff08;Re…

策略模式+工厂模式(案例实践易懂版)

最近,可以说这2025年度,自己更文的次数都大大减少,主要最近大环境不景气,自己职业也受到波及,学习的东西也是因为AI而变得更多, 没办法,你不学,总有人会学,关于AI的我也准备出个专辑,相信绝对帮助到大家 额,好像说多了,言归正传,我们看一下今天的主题:策略模式工厂模式 本文主要…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解snowNLP库实现中文情感分析 视频在线地址&…

大根堆,小根堆,双指针

码蹄集OJ-大约 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART协议中&#xff0c;空闲状态为高电平&#xff0c;也就是1,R25和R27&#xff0c;485收发器特性MAX485 (美信)SSP485 (国产替代)AZRS3080 (安格)供电电压5V5V3.3V ~ 5.5V静态电流300μA (接收模式)120μA (接收模式)150μA (接收模式)传输速率2.5Mbps10Mbps20Mbps总线负载能力…

【Android】交叉编译faiss库 | 问题解决

目录 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题 二 交叉编译faiss ■禁用 BLAS并交叉编译faiss ■使用 OpenBLAS 的 Android 移植版本并交叉编译faiss 三 报错处理 ■报错 ■SWIG 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题