C++类与对象-基础篇

目录

一、什么是类

1.1 语法定义

1.2 访问限定符

1.3 类域

二、类的实例化

2.1 什么是实例化

2.2 类的大小

三、this指针

3.1 引入

3.2 this指针的使用


一、什么是类

1.1 语法定义

class 类名
{};

说明

  1. 类似于C语言中的结构体,括号后分号不能丢
  2. 类内成员可以为变量,函数(与结构体不同)
  3. C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类:struct中也可以定义函数

举例(以顺序表为例)

#include<iostream>using namespace std;class SeqList
{
public:void Init(int n = 4){arr = (int*)malloc(sizeof(int) * n);if (arr == nullptr){perror("malloc");exit(1);}capacity = n;size = 0;}void Destory(){free(arr);arr = nullptr;size = capacity = 0;}
private:int* arr;int size;int capacity;
};

1.2 访问限定符

  1. public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,在继承章节才能体现出他们的区别。
  2. class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

1.3 类域

类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中。当声明和定义分离时,需要指定类域。

#include<iostream>using namespace std;class SeqList
{
public:void Init(int n = 4);void Destory(){free(arr);arr = nullptr;size = capacity = 0;}
private:int* arr;int size;int capacity;
};void SeqList::Init(int n = 4)
{arr = (int*)malloc(sizeof(int) * n);if (arr == nullptr){perror("malloc");exit(1);}capacity = n;size = 0;
}

类域影响的是编译的查找规则,如果不指定类域中的函数,编译器就会把它当成全局函数,那么编译时,找不到该成员的声明/定义,就会报错。类内访问类似于C语言中结构体的访问,使用符号.

#include<iostream>using namespace std;class SeqList
{
public:void Init(int n = 4){arr = (int*)malloc(sizeof(int) * n);if (arr == nullptr){perror("malloc");exit(1);}capacity = n;size = 0;}void Destory(){free(arr);arr = nullptr;size = capacity = 0;}
private:int* arr;int size;int capacity;
};
int main()
{SeqList sq;sq.Init();return 0;
}

二、类的实例化

2.1 什么是实例化

  • 类似于C语言中的结构体,类也相当于图纸,仅仅限定了有哪些变量,这些只是声明,没有分配空间。⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
  • ⼀个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
#include<iostream>
using namespace std;
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;Date d2;d1.Init(2005,6, 8);d1.Print();d2.Init(2024, 7, 10);d2.Print();return 0;
}

2.2 类的大小

类的大小类似于C语言中的结构体内存计算,遵循内存对齐的原则。详解请见:

C语言自定义数据类型(1)结构体_数据改成结构体c语言-CSDN博客文章浏览阅读1k次,点赞43次,收藏27次。本文是C语言自定义类型中结构体的详解,囊括了结构体的所有知识,同时配上了大厂笔试重点题的讲解。_数据改成结构体c语言https://blog.csdn.net/paradiso989/article/details/136855002

  1. 结构体的第⼀个成员要对⻬到和结构体变量起始位置偏移量为0的地址处。
  2. 其他成员变量要对⻬到对⻬数的整数倍的地址处。
  3. 对⻬数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较⼩值。
  4. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对齐数中最⼤的)的整数倍
  5. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到⾃⼰的成员中最⼤对齐数的整数倍处,结构体的整体大小就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

唯一有区别的是:类内存在函数,函数不和变量存在一块空间中,计算空间占用不用考虑函数

三、this指针

3.1 引入

当同一类实例化出多个对象时,调用函数,由于函数体中没有关于不同对象的区分,那当不同对象调用函数时,该函数是如何知道应该访问的是哪个对象呢?

实际上编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。类的成员函数中访问成员变量,本质都是通过this指针访问的。

以上述Date类为例

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}//实际上是void Init(Date* const this,int year, int month, int day){_year = year;_month = month;_day = day;}
}

3.2 this指针的使用

C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内
⽰使⽤this指针。

基础用法:使用this指针可以访问对象的成员变量和成员函数:

class MyClass {
public:int value;void setValue(int value) {this->value = value;}
};

更高阶的用法见博主后续博客更新

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

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

相关文章

算术运算符用途解析及应用案例

文章目录 常用的算术运算符及其用途&#xff1a;运算符优先级类型转换高级用法 应用案例1. 计算器程序2. 平方根计算3. 计算平均数和标准差4. 货币兑换5. 计算几何6. 动力学模拟7. 数字图像处理8. 金融计算&#xff1a;复利计算 常用的算术运算符及其用途&#xff1a; 算术运算…

前端面试题40(浅谈MVVM双向数据绑定)

MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式是一种用于简化用户界面&#xff08;UI&#xff09;开发的软件架构设计模式&#xff0c;尤其在现代前端开发中非常流行&#xff0c;例如在使用Angular、React、Vue.js等框架时。MVVM模式源于经典的MVC&#xff08;Mod…

软件架构之软件架构概述及质量属性

软件架构之软件架构概述及质量属性 第 9 章&#xff1a;软件架构设计9.1 软件架构概述9.1.1 软件架构的定义9.1.2 软件架构的重要性9.1.3 架构的模型 9.2 架构需求与软件质量属性9.2.1 软件质量属性9.2.2 6 个质量属性及实现 第 9 章&#xff1a;软件架构设计 像学写文章一样&…

前后端如何实现非对称加解密-使用RSA为例讲解!

写在最前面&#xff0c;RSA是一种非对称加密算法&#xff0c;使用不同的公钥和私钥进行加密和解密。 下面是使用RSA进行加密和解密的代码示例&#xff1a; 前端&#xff1a;使用CryptoJS进行RSA加密 在前端JavaScript中&#xff0c;使用jsencrypt库来进行RSA加密&#xff1a…

领夹麦克风哪个品牌好,哪个麦克风好,热门无线麦克风品牌推荐

​无线领夹麦克风是现代沟通的重要工具&#xff0c;它不仅提高了语音交流的清晰度&#xff0c;还展现了使用者的专业形象。随着技术发展&#xff0c;这些麦克风已经变得更加轻便、时尚&#xff0c;易于使用。在各种场合&#xff0c;如演讲、教育和网络直播中&#xff0c;当然&a…

Matplotlib入门

#折线图用来表示数据的变化 plt.plot(x,y) #直方图用来统计连续性数据 无间隔 plt.hist(data数组,组数) #条形图用来统计离散的数组 并且反映其变化 有间隔 plt.bar(x,y,width 0.3) plt.barh(y,x,height 0.3) #散点图用来xy轴之间的联系 趋势 plt.scatter(x,y) #导入p…

重命名文件的方法有哪些?重命名文件的工具有哪些?

在日常的计算机使用过程中&#xff0c;重命名文件是一项常见但至关重要的任务。无论是为了更好地组织文件、修复命名错误&#xff0c;还是简化文件管理流程&#xff0c;掌握正确的重命名方法和工具都能显著提升效率。 本文将探讨多种重命名文件的方法&#xff0c;同时介绍几款高…

解决Invalid or unsupported by client SCRAM mechanisms(dbeaver)

在用工具&#xff08;dbeaver&#xff09;链接Opengauss数据库的时候&#xff0c;报出标题的错误。原因为驱动不正确。 驱动下载地址&#xff1a;https://opengauss.org/zh/download/ 下载完的包 &#xff0c;解压后&#xff0c;里面应该有两个jar 包,使用postgresql.jar dbe…

国产大模型第一梯队玩家,为什么pick了CPU?

AI一天&#xff0c;人间一年。 现在不论是大模型本身&#xff0c;亦或是AI应用的更新速度简直令人直呼跟不上—— Sora、Suno、Udio、Luma……重磅应用一个接一个问世。 也正如来自InfoQ的调查数据显示的那般&#xff0c;虽然AIGC目前还处于起步阶段&#xff0c;但市场规模已…

qmt量化交易策略小白学习笔记第55期【qmt编程之期权数据--获取历史期权列表】

qmt编程之获取期权数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取历史期权列表 …

教师管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;个人认证管理&#xff0c;课程信息管理&#xff0c;课堂记录管理&#xff0c;课堂统计管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程信息…

Postman使用教程【项目实战】

目录 引言软件下载及安装项目开发流程1. 创建项目2. 创建集合(理解为&#xff1a;功能模块)3. 设置环境变量&#xff0c;4. 创建请求5. 测试脚本6. 响应分析7. 共享与协作 结语 引言 Postman 是一款功能强大的 API 开发工具&#xff0c;它可以帮助开发者测试、开发和调试 API。…

java项目总结数据库

1.什么是数据库 用于存储和管理数据的仓库 2.数据库的特点 1.持久化存储数据。确实数据库就是一个文件系统。 2.便于存储和管理数据 3.使用统一的方式操作数据库 --SQL 3.MqSql服务启动 4.登录和退出 这里的ip值IP地址 5.客户端与服务器关系 6.目录结构 7.SQL 1.什么是SQL&…

节点流与处理流:深入解析Java中的IO流

节点流与处理流&#xff1a;深入解析Java中的IO流 1、节点流&#xff08;Node Stream&#xff09;1.1 定义1.2 好处1.3 示例 2、处理流&#xff08;Processing Stream&#xff09;2.1 定义2.2 好处2.3 创建特征2.4 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&…

JavaWeb__正则表达式

目录 1. 正则表达式简介2. 正则表达式体验2.1 验证2.2 匹配2.3 替换2.4 全文查找2.5 忽略大小写2.6 元字符使用2.7 字符集合的使用2.8 常用正则表达式 1. 正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行…

如何在Vue中实现拖拽功能?

Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。其中一个常见的需求是在Vue中实现拖拽功能&#xff0c;让用户可以通过拖拽元素来进行交互。今天&#xff0c;我们就来学习如何在Vue中实现这一功能。 首先&#xff0c;我们需要明白拖拽功能的基本原理&#xf…

Java 修改微信公众号后台服务器地址URL后,微信公众平台客服功能接收不到用户发送的消息的解决办法

解决办法&#xff1a; 检查一下微信回调URL是否转发了客服消息。 /*** 处理具体的回调信息*/ PostMapping("/callback") public void callback(RequestParam(name "signature", required false) String signature,RequestParam(name "timestamp&q…

centos系统查找mysql的配置文件位置

执行命令查找mysql的安装目录&#xff1a; which mysql cd进入mysql的安装目录 cd /usr/bin 查找配置文件位置 ./mysql --help | grep "my.cnf" 定位配置文件 cd /etc 查找命令还可以用find命令 find / -name "my.cnf"

iOS UITableView自带滑动手势和父视图添加滑动手势冲突响应机制探索

场景 我们有时候会遇到这样的一个交互场景&#xff1a;我们有一个UITableView 放在一个弹窗中&#xff0c;这个弹窗可以通过滑动进行展示和消失&#xff08;跟手滑动的方式&#xff09;&#xff0c;然后这个UITableView放在弹窗中&#xff0c;并且可以滚动&#xff0c;展示一些…

用微信服务号支付门诊缴费

时间上午10刚过&#xff0c;医院里计价收费处排起了长龙&#xff0c;放眼望去&#xff0c;左边的窗口六条队。右边在原来发药的位置也开辟了收费窗口&#xff0c;数了一下有四条队。一共十条排队付费的长龙&#xff0c;每一条队伍的人数不下20人&#xff0c;也即超过200人在排队…