初识C++|类与对象(上)

🍬 mooridy-CSDN博客

🧁C++专栏(更新中!)

1. 类的定义

1.1 类定义格式

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的⽅法或 者成员函数
class stack {
public:
	void Init(int n=4) {
		int* arr = (int*)malloc(sizeof(int) * n);
		if (arr == nullptr) {
			perror("malloc fail!");
			return;
		}
		capacity = n;
		top = 0;
	}
	void push(int n) {
		//扩容
		arr[top++] = n;
}

	int top() {
		return arr[top];
	}

	void destroy() {
		free(arr);
		arr = nullptr;
		top = 0;
		capacity = 0;
	}

private:
	int* array;
	size_t capacity;
	 size_t top;
};

为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头。(不是强制的,只是⼀些惯例)

class Date {
public:
	void Init(int day,int month,int year) {
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;//或者m_year  year_
	int _month;
	int _day;
};

C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是

struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
//不再需要用typedef
struct ListNode {
	int x;
	ListNode* pnext;//区分C语言:struct ListNode* pnext;
};
定义在类⾯的成员函数默认为inline。

1.2 访问限定符

• C++⼀种实现 封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的⽤⼾使⽤。

public修饰的成员在 类外可以直接被访问protectedprivate修饰的成员在 类外不能直接被访
,此处protected和private是⼀样的。

• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束。

class定义成员没有被访问限定符修饰时默认为 privatestruct默认为 public

⼀般成员变量都会被限制为 private/protected需要给别⼈使⽤成员函数会放为 public

1.3 类域

类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作 ⽤域操作符指明成员属于哪个类域。(不然就会查找全局而不会查找类域内的成员)

2. 实例化

2.1 实例化概念

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

2.2 对象⼤⼩

Q:对象中有哪些成员呢?

成员变量:肯定有。

eg.Date实例化d1和d2两个对象,d1和d2都有各⾃独⽴的成员变量 _year/_month/_day存储各⾃的数据。

成员函数:没有。

eg.Date实例化d1和d2两个对象,但是d1和d2的成员函数Init/Print指针却是⼀样的,存储在对象 中就浪费了。

结论:对象中只存储成员变量
C++规定类实例化的对象也要符合内存对齐的规则。
内存对齐规则
第⼀个成员在与结构体偏移量为0的地址处。
其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
VS中默认的对⻬数为8
结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
 class A
{
 public:
 void Print()
 {
 cout << _ch << endl;
 }
 private:
 char _ch;
 int _i;
 };

A类对象大小为8字节。

图解:

C++规定:没有成员变量的类对象的⼤⼩是1字节。
原因:因为如果⼀个字节都不给,无法表⽰对象存在过!所以这⾥给1字节,纯粹是为了占位标识对象存在。
class B
 {
 public:
void Print()
 {
 //...
}
 };

 class C
{};

B和C类对象大小都为1.

3. this指针

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了 ⼀个隐含的this指针解决这⾥的问题。

编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。⽐如Date类的Init的真实原型为, void Init(Date* const this, int year, int month, int day)
类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this- >_year = year;

C++规定不能实参形参的位置显式的写this指针(编译时编译器会处理),但是可以在函数体内显式使用this指针。注:this指针存在栈中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务

目录 0.简介 1.环境 2.知识点 3.详细过程 1&#xff09;创建空项目 2&#xff09;添加Web表单 3&#xff09;使用Web表单的GUI设计 4&#xff09;添加服务引用 5&#xff09;在Web的button函数中调用服务&#xff0c;获取PI值 6&#xff09;测试 0.简介 本文属于一个…

如何直接套用模板,快速搭建一个3D展示页面?

随着Web3D技术的飞速进步&#xff0c;网页设计实现了从平面二维到立体三维的华丽蜕变&#xff0c;这一变革为品牌营销领域注入了前所未有的互动活力。多样化的3D营销手段&#xff0c;不仅极大地吸引了消费者的目光&#xff0c;还显著提升了品牌形象与销售量&#xff0c;助力企业…

各类专业技术的pdf电子书

从业多年&#xff0c;收集了海量的pdf电子书籍&#xff0c;感兴趣的私聊。

探索智慧校园德育系统的学生考核之道

在当代教育领域&#xff0c;智慧校园德育管理系统的学生考核功能正逐渐成为推动学生全面发展的重要引擎。它不仅革新了传统德育评价的方式&#xff0c;还深度融入了学生日常的学习生活&#xff0c;成为连接学生、教师与学校管理层之间沟通与理解的桥梁。德育考核功能的核心在于…

Excel办公技巧:制作二级联动下拉菜单

分享制作二级联动下拉菜单的方法&#xff0c;即使数据有增删&#xff0c;菜单也能自动更新&#xff01; 可以通过先定义名称&#xff0c;再结合数据验证&#xff0c;来做二级联动下拉菜单。 1. 准备数据 首先&#xff0c;我们需要准备好要进行二级联动下拉菜单的数据&#xff…

【大模型入门】LLM-AI大模型介绍

大语言模型 (LLM) 背景 &#x1f379;大语言模型 (Large Language Model) 是一种人工智能模型, 它们通常包含数千亿甚至更多的参数&#xff0c;并在大规模数据集上进行训练。大语言模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、翻译、对话等等。 自然语言模型…

识别 TON 生态系统中前10种加密资产,以bitget 钱包为例

元描述&#xff1a;想要找到下一个 100 倍加密货币投资&#xff1f;请密切关注这篇文章&#xff1b;它揭示了所有可能很快变得非常有价值的 TON 网络宝石。 由 Telegram 提供支持的 TON&#xff08;开放网络&#xff09;生态系统正在蓬勃发展&#xff01;这是一个充满激动人心的…

【雅思备考IELTS】美文阅读 艾米莉·勃朗特《呼啸山庄》Wuthering Heights by Emily Bronte

Reading Materials for IELTS (from books that I love) Episode 2 2024/7/15 By James Lee 说明&#xff1a; 奇崛、跌宕、爱恨分明&#xff0c;英国女作家艾米莉 勃朗特&#xff08;Emily Bronte&#xff0c;1818-1848&#xff09;短暂一生当中出版的唯一一本小说&#xff…

typescript新规范及vue3常用的属性解析【2024】

文章目录 如在vue中 使用tyescript来规范定义类型解释一下 < >的意思 定义 了 personList &#xff1a;是个数组 Array 且要告诉里面每一项 结构长什么样 Array<PersonInter>definepropsvue3中的hooks组件父子组件 方法、数据、相互调用 如在vue中 使用tyescript来…

C语言课程回顾:十、C语言之 指针

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 C语言之 指针 10 指针10.1 地址指针的基本概念10.2 变量的指针和指向变量的指针变量10.2.1 定义一个指针变量10.2.2 指针变量的引用10.2.3 指针变量作为函数参数10.2.4 指针变…

嵌入式热门领域有哪些?

嵌入式热门领域有哪些? 当前&#xff0c;嵌入式行业正处于快速发展阶段&#xff0c;并在多个领域呈现出蓬勃的热度。 物联网 物联网作为目前嵌入式行业的炙手可热领域之一&#xff0c;已经在各行业展现出了强劲的增长势头。嵌入式系统通过物联网连接各种物理设备和传感器&…

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析?

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析&#xff1f; Prompt模板&#xff1a; Initial Request: 初始请求&#xff1a; I have uploaded data of the number of Software Engineering Jobs in the US since May 2020. I need different visual creative…

AD复制原理图时候怎么保留原理图的元器件编号

AD复制原理图时候&#xff0c;默认复制过去所有编号全部丢失变成“&#xff1f;”&#xff0c;怎么保留原理图的元器件编号&#xff1f; 1.右上角打开设置&#xff1b; 2. Schematic---》Graphical Editing---》去勾选“选项&#xff1a;粘贴时重置元件位号Reset Parts Design…

卷积加速算法img2col、Winograd、FFT

FFT 空间域中矩阵的卷积算子&#xff0c;实际等于频率域中两个矩阵元素相乘。但卷积的方向是相反的。 通常情况下&#xff0c;feature的尺寸要比卷积的尺寸大很多&#xff0c;如果对两者进行快速傅里叶变换的话&#xff0c;得出来的两个矩阵大小不一样&#xff0c;不能进行对…

【JS红宝书学习笔记】第25章 客户端存储

第25章 客户端存储 Cookie HTTP是无状态的&#xff0c;也就是说&#xff0c;你这次访问服务器&#xff0c;关闭后再次访问服务器&#xff0c;服务器是意识不到又是你来访问的。 登录时&#xff0c;浏览器需要帮我们在每一次请求里加入用户名和密码&#xff0c;这样才能做到保…

盲盒一番赏小程序:开启惊喜之旅,探索无限创意!

在这个充满无限想象与惊喜的时代&#xff0c;盲盒已成为连接心灵与梦想的奇妙桥梁。为了将这份独特的乐趣与探索精神传递给每一位热爱生活、追求新鲜的你&#xff0c;我们自豪地推出了“盲盒一番赏”小程序——一个集创意、趣味、互动与社交于一体的盲盒新纪元&#xff0c;邀您…

三大知名向量化模型比较分析——m3e,bge,bce

先聊聊出处。 M3E 是 Moka Massive Mixed Embedding 的缩写&#xff0c; Moka&#xff0c;此模型由 MokaAI 训练&#xff0c;开源和评测&#xff0c;训练脚本使用 uniem &#xff0c;评测 BenchMark 使用 MTEB-zhMassive&#xff0c;此模型通过千万级 (2200w) 的中文句对数据…

【C++】——类和对象(中)

文章目录 类的默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载运算符重载 const成员函数 类的默认成员函数 在C中&#xff0c;类&#xff08;class&#xff09;可以拥有多种成员函数&#xff0c;其中一些成员函数在类定义中没有显式声明时&#xff0c;编译器会隐式地…

微软最新AI:GraphRAG+Chainlit实现跨文档智能检索分析打造私人AI助手

文章目录 前言一、GraphRAG安装二、Chainlit安装学习资料 前言 本月初&#xff0c;微软发布最强 RAG 知识库开源方案 GraphRAG&#xff0c;项目上线即爆火&#xff0c;现在星标量已经达到 10.9 k。 https://github.com/microsoft/graphrag 一、GraphRAG安装 1.创建一个新项目…

电脑使用干货 · 阻止更换主题时改变鼠标指针样式

大家在使用主题的时候会发现&#xff0c;可能更改主题时会自动变换鼠标指针。 本教程将向您展示如何在Windows 10和Windows 11中允许或阻止主题更改您的鼠标指针。 防止主题更改鼠标指针 下载 防止主题更改鼠标指针.reg 运行 > 确定&#xff0c;即可 REG文件内容供参考 …