C++类和对象(上篇)

文章目录

  • 前言
  • 一、面向过程和面向对象初步认识
  • 二、类的引入
  • 三、类的定义
  • 六、类的实例化
  • 七、类的对象大小的计算
  • 八、类成员函数的this指针
  • 总结


前言

类和对象是面向对象编程的两个核心概念。

类是一种抽象的数据类型,是描述对象共同特征和行为的模板。一个类包括属性和方法。属性是类的数据成员,描述对象的特征;方法是类的成员函数,描述对象的行为。类定义了对象的结构和行为。

对象是类的实例化,是具体的实体。一个对象具有类中定义的属性和方法。可以通过创建对象来使用类中定义的属性和方法。

通常,类是创建对象的蓝图,对象是类的实例,类描述了对象的属性和行为。类可以看作是一种抽象的概念,而对象是具体的实例。通过类可以创建多个对象,每个对象都具有相同的属性和方法,但其具体的属性值可能不同。


一、面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++ 基于面向对象 的, 关注 的是 对象 ,将一件事情拆分成不同的对象,靠对象之间的交互完 成。

二、类的引入

C 语言结构体中只能定义变量,在 C++ 中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C++ 方式实现, 会发现 struct 中也可以定义函数

三、类的定义

1.类定义格式

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。
C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。
定义在类面的成员函数默认为inline。
class Date
{public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}private:// 为了区分成员变量,⼀般习惯上成员变量// 会加⼀个特殊标识,如_ 或者 m开头int _year; // year_ m_yearint _month;int _day;
};

2.访问标识符

C++⼀种实现封装的方式,用类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接口提供给外部的用户使⽤。
• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
• 访问权限作用域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为止,如果后面没有 访问限定符,作用域就到 }即类结束。
• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
⼀般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

3.类域 

类定义了⼀个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
• 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include<iostream>using namespace std;class Stack{public:// 成员函数void Init(int n = 4);private:// 成员变量int* array;size_t capacity;size_t top;
};// 声明和定义分离,需要指定类域void Stack::Init(int n){array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;}int main(){Stack st;st.Init();return 0;
}

四、类的实例化

1.概念

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

2.对象大小

class A
{public:void PrintA(){cout<<_a<<endl;}private:char _a;
};
结论:一个类的大小,实际就是该类中 成员变量 之和,当然要注意内存对齐
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

3结构体内存对齐规则

1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

五、类成员函数的this指针

1. this 指针的类型:类类型 * const ,即成员函数中,不能给 this 指针赋值。
2. 只能在 成员函数 的内部使用
3. this 指针本质上是 成员函数 的形参 ,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以 对象中不存储 this 指针
4. this 指针是 成员函数 第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传
递,不需要用户传递


总结

类和对象是面向对象编程中重要的概念。

类是指对具有相同特征和行为的对象进行分类描述的模板或蓝图。它定义了一类对象的共同属性和方法。类可以看作是一种数据类型,用于创建对象。

对象是类的实例,是具体存在的实体。一个对象具有类定义的属性和方法,并且可以独立地执行这些方法。对象是根据类定义创建的,类定义了对象的属性和方法,而对象则是类的实例。

类和对象之间的关系是类是对象的抽象,而对象是类的具体实例。一个类可以实例化多个对象,每个对象都具有相同的属性和方法。

类和对象在面向对象编程中具有重要的意义。通过使用类和对象,可以将程序分解为多个相互独立的模块,每个模块负责一部分功能。这种模块化的设计可以提高代码的可重用性、可维护性和可扩展性。同时,类和对象还能够隐藏内部实现细节,使得代码更加安全和简洁。

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

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

相关文章

yolov5:Conv类参数量计算

Conv是yolov5自定义的类&#xff0c;里边包含了卷积层、BN层和激活函数 class Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act nn.SiLU() # default activationdef __init__(self, c…

点云下采样有损压缩

转自本人博客&#xff1a;点云下采样有损压缩 点云下采样是通过一定规则对原点云数据进行再采样&#xff0c;减少点云个数&#xff0c;降低点云稀疏程度&#xff0c;减小点云数据大小。 1. 体素下采样&#xff08;Voxel Down Sample&#xff09; std::shared_ptr<PointClo…

华为机考真题 -- 信道分配

题目描述&#xff1a; 算法工程师小明面对着这样一个问题&#xff0c;需要将通信用的信道分配给尽量多的用户&#xff0c; 信道的条件及分配规则如下&#xff1a; 1) 所有信道都有属性&#xff1a;”阶”。阶为 r 的信道容量为 2^r 比特&#xff1b; 2) 所有用户需要传输的数…

区间贪心

目录 1.贪心算法的思想 2.区间贪心算法常用的一些题目类型 1.选择最多不相交区间问题 P2970 [USACO09DEC] Selfish Grazing S 1.思路分析 2.上代码 2.区间选点问题 P1250 种树 1.题目 2.方法一 1.代码解释 3.方法二 3.区间合并问题 P2434 [SDOI2005] 区间 1. 思路…

中科海讯 C++初级研发工程师笔试题目

C语言中的const关键字有什么作用&#xff1f;为什么要使用const关键字&#xff1f; 1 const修饰的变量将会被放到常量区&#xff0c;避免被意外的改动。 const修饰的常量比#define修饰的有更多的优势&#xff0c;比如可以调试&#xff0c;类型检查等 2 const修饰的参数可做输入…

Java集合面试题

Java集合框架 1、List、Set、Map的区别2、ArrayList、LinkedList、Vector区别3、为什么数组索引从0开始&#xff0c;而不是从1开始&#xff1f;4、ArrayList底层的实现原理5、红黑树、散列表6、HashMap的底层原理7、HashMap的put方法具体流程8、HashMap的扩容机制9、HashMap是怎…

南方科技大学马永胜教授给年轻人使用AI工具上的建议

摘要 - 1. AI的未来&#xff0c;是机器人和机器人之间的合作&#xff1b; 2. 行业的发展方向是需求决定的&#xff0c;不要做同质化的发展&#xff0c;要做专/精/特/新&#xff1b; 3. 新质生产力 &#xff08; 科学技术革命性突破 生产要素创新型配置 产业深度转型升级&…

java通过poi-tl导出word实战详细步骤

文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让…

贪心算法-以高校教材管理系统为例

1.贪心算法介绍 1.算法思路 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行&#xff0c;根据某个优化测度&#xff0c;每一 步都要确保能获得局部最优解。每一步只考虑一 个数据&#xff0c;其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起…

Pix4Dmapper:无人机测绘的革命性工具

在现代测绘和地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;Pix4Dmapper无疑是一款革命性的工具。作为一名长期使用这款软件的用户&#xff0c;我深深感受到它在工作中的重要性和便利性。Pix4Dmapper不仅仅是一款软件&#xff0c;更是测绘工作者的得力助手&#xff…

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

新一代信息技术及应用

关于云计算的描述不正确的是&#xff08; &#xff09;。 A 云计算可以通过网络连接&#xff0c;用户通过网络接入“云”中并获得有关的服务&#xff0c;“云”内节点之间也通过内部的网络相连 B 云计算可以快速、按需、弹性服务&#xff0c;用户可以按照实际需求迅速获取或释放…

[Python学习篇] Python面向对象——类

面向对象是什么&#xff1f; 面向对象&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计应用程序和计算机程序。OOP的核心概念包括类&#xff08;Class&#xff09;、对象&#xff08;Object&#xff09…

批量下载手机中APP程序中文件

需求 利用 adb pull 下载手机中app的某目录 adb pull 命令本身不支持直接下载整个目录&#xff08;文件夹&#xff09;及其所有子目录和文件作为一个单一的操作。但是&#xff0c;可以通过一些方法来间接实现这一目的。 方法 1. 首先将要下载的目录进行 tar 打包 # 在 And…

Python面试题:Python 中的 `property` 函数有什么用?

在 Python 中&#xff0c;property 函数用于创建和管理类中的属性。它允许你将方法转换为属性&#xff0c;这样你可以像访问变量一样访问这些方法。这对于控制属性的访问和修改非常有用&#xff0c;因为它允许你在属性访问时执行额外的逻辑&#xff08;如验证或计算&#xff09…

光通信领域常见的会议和期刊总结

在高速光通信小组待了一年&#xff0c;对我们领域主要的会议和期刊也有了一定的了解&#xff0c;所以总结一下我们可以投的期刊或会议有哪些。会议一般有OFC、ECOC、CLEO、OECC、ACP等&#xff0c;期刊则有OE、OL、PTL、JLT、PJ、AO、JOSA等&#xff0c;下面简单介绍一下。 先…

【atcoder】习题——位元枚举

题意&#xff1a;求i&M的popcount的和&#xff0c;i属于0……N 主要思路还是变加为乘。 举个例子N22&#xff0c;即10110 假设M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

算法学习笔记(8.1)-动态规划入门

目录 问题特性&#xff1a; 最优子结构&#xff1a; 代码示例&#xff1a;&#xff08;动态规划最优子结构&#xff09; 上述最小代价爬楼梯的运行过程&#xff1a; 代码示例&#xff1a; 无后效性&#xff1a; 解析&#xff1a; 具体过程图示如下&#xff1a; 具体的…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书的方式&#xff1a; 确保网络通信安全的核心要素之一&#xff0c;是有效利用SSL证书来加密数据传输&#xff0c;特别是对于那些直接通过IP地址访问的资源。I…

使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制台应用 CI/CD

Web 应用程序通常需要作为后台任务运行的进程&#xff0c;并在特定时间间隔进行计划或在事件中触发。它们不需要花哨的 IO 接口&#xff0c;因为重点是过程而不是输出。Azure WebJobs 提供了出色的支持&#xff0c;通常在云环境中通过 Web 控制台应用程序来实现此目的。WebJob …