类和对象(初)

目录

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

二、类的引入

 命名规则

三、类的定义

四、访问限定符

五、类的作用域

六、类的实例化

七.类对象模型


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

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

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

以洗衣服为例子

c语言关注

c++关注

二、类的引入

鉴于C++面向对象的特点,于是就创建出类这个概念来处理每个对象,我们可以通过类来描述每个对象的全部特点 

但是虽然c++是基于面向对象的语言,关注对象,但是它也支持面向过程,因此c语言和c++的代码可以混编

c++兼容c语言,结构用法可以继续使用

同时struct也升级成了类

struct Stack//类名
{int* a;int top;int capacity;
};int main()
{struct Stack st1;//结构体的用法Stack st2;//类的用法,类名可作类型
};

同时,类中不止可以定义变量,也可以声明和定义函数 

不用我们主动传参,成员函数可以直接访问成员变量,例子如下

typedef int DataType;
struct Stack
{void Init(size_t capacity){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr == _array){perror("malloc申请空间失败");return;}_capacity = capacity;_size = 0;}DataType* _array;size_t _capacity;size_t _size;
};
int main()
{Stack s;s.Init(10);return 0;
}

 命名规则

为了避免函数形参与成员变量之间产生混淆等 ,我们一般将成员变量加上标记处理,比如_,my等等。如果形参与成员变量名称相同,默认优先使用局部域的变量,就会形成局部变量自己赋值给自己的情况

class Date
{
public:void Init(int year){_year = year;}
private:int _year;
};
// 或者这样
class Date
{
public:void Init(int year){mYear = year;}
private:int mYear;
};

三、类的定义

但是c++中更喜欢使用class,主要原因在4.访问限定符中讲

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

        class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数


类的两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器会将其当成内
联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

因为编译器遇到一个变量要去找,加了类名它才知道去哪找,不加类名它只会默认在全局去找

一般情况下,更期望采用第二种方式 

四、访问限定符

C++实现封装的方式:

用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

【访问限定符说明】
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } ,即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C),因此我们在c++中更喜欢使用class
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

一般来说我们习惯将成员变量私有,通过公有的成员函数进行访问,同时,类里面不受访问限定符的限制

五、类的作用域


类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。

class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;
}

我们可以将花括号就看成一个域的界限 

六、类的实例化

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 d;//这里开了空间,这才叫定义return 0;
}

那三个成员变量都绑在一起定义了, 对象的定义也叫做对象的实例化。

同样的,函数的定义和声明也是一样,定义需要分配存储空间;声明只是告诉编译器这个函数已经在别处定义过了。

函数的定义和声明比较好区分。有函数体的即为定义,不带函数体即为声明。

七.类对象模型

接下来再看另一个问题

int main()
{date d1;d1.init(2024,7,12);d1.Print();d1._year;date d2;d1.init(2024,7,13);d1.Print();d2._year;
}

我们sizeof(date)  与sizeof(d1)得出的值均为12(实际上,sizeof计算对象的大小也是转换成对对象类型的计算)

我们知道,d1中的_year  与d2中的_year不是一个变量,但是d1中的Print()与d2中的Print()是同一个函数,如果我们在每个对象中都存一个,这种方式不划算。所以d1.year 与d2._year是到对象里面去找,但是d1.Print()与d2.Print()是到公共的代码区去找。成员函数与全局函数都储存在公共代码区

因此一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

// 类中什么都没有---空类
class A
{};

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

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

相关文章

鸿蒙语言基础类库:【@ohos.data.storage (轻量级存储)】

轻量级存储 轻量级存储为应用提供key-value键值型的文件数据处理能力&#xff0c;支持应用对数据进行轻量级存储及查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型。 说明&#xff1a; 开发前请熟悉鸿蒙开发…

第一个基于FISCOBCOS的前后端项目(发行转账)(已开源)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…

游戏AI的创造思路-技术基础-行为树

行为树源自于游戏&#xff0c;但又不单单局限在游戏中&#xff0c;现代的行为树为游戏提供了一套快速简洁的控制NPC/AI的方法。所以本篇来讲讲行为树这个老祖宗~~~~ 目录 1. 行为树的定义 2. 发展历史 2.1. 起源与早期发展 2.2. 关键节点与重要进展 2.3. 当前现状与未来 …

人工智能大模型讲师培训老师叶梓介绍及多模态大模型原理与实践提纲

培训需要解决的问题 通过本次培训&#xff0c;拓展对多模态AI应用领域的视野&#xff0c;帮助团队聚焦AI赋能创新突破&#xff0c;提升对AI服务的技术认知与理解&#xff0c;更好地助力业务智能化业务建设。 培训时长 1天 培训老师介绍 叶梓&#xff0c;工学博士&#xff0…

python零基础爬虫教程,(实战案例手把手教你Python爬虫教程!)

前言 女朋友看了都能学会的爬虫教学 自己断断续续学习练习了两三年python爬虫&#xff0c;从网上看了无数教程&#xff0c;跟大神们学习了各种神奇的操作&#xff0c;现在虽然没成为大神&#xff0c;但是想通过这篇教程来分享自己学习的爬虫实战案例。 通过本教程&#xff0c;你…

Linux程序替换

前言 上一期对进程的创建、终止、以及等待做了详细的介绍&#xff0c;对于进程控制的内容基本介绍的差不多了&#xff0c;本期来介绍进程控制的最后一个内容即进程的程序替换&#xff01; 本期内容介绍 • 什么是进程的程序替换 • 单进程的程序替换 • 程序替换的基本原理 •…

在 IVS 2024 加密盛会上开拓创新:CESS 引领去中心化云存储和 CD²N 之发展

作为基于区块链的去中心化云存储网络和 CDN 基础设施网络&#xff0c;CESS 在日本年度加密创业大会 IVS 2024 上成为焦点&#xff01;此次活动在历史悠久的京都举办&#xff0c;围绕“跨越边界”这一主题&#xff0c;吸引了超过15,000 名参会者&#xff0c;其中包括 3,000 创始…

SpringCloudAlibaba基础五 Nacos配置中心

一 Nacos配置中心介绍 官方文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos C…

2024 福州市延安中学“拿云杯”复赛试题

回忆版&#xff08;持续更新&#xff09; 目录 答案 答案

风光摄影:相机设置和镜头选择

写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置&#xff0c;镜头选择的建议对小白来讲很实用&#xff0c;避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换&#xff08;FFT&#xff09; 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术&#xff0c;特别是在…

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…

做3D渲染,选择什么显卡好?

对于设计行业的小伙伴来说&#xff0c;电脑配置的优劣是个尤为关键的要素&#xff0c;特别是显卡&#xff0c;对于很多人而言&#xff0c;如何选择一张最适合的 3D 渲染显卡确实一大难关&#xff01; 在目前市场上&#xff0c;主流的显卡分别是 AMD 显卡和 NVIDIA 显卡&#x…

Java基础面试题大全

Java基础 语法基础 aab 和 ab 操作隐式的将操作的结果类型强制转换成持有结果的类型&#xff0c;而不会 比如对byte&#xff0c;short&#xff0c;int类型的操作&#xff0c;会先将他们提升到int类型&#xff0c;然后在执行操作。所以比如我定义了两个byte类型的a和b&#x…

KEIL 5项目中源文件图标带有雪花(四叶草)消除办法

今天在使用KEIL 5写STM32程序的时候&#xff0c;出现了一个错误&#xff1a; Error: L6218E: Undefined symbol test_for_diaodu (referred from main.o). 具体表现为&#xff0c;不管我把自己写的一个my.c里的什么函数或者变量名&#xff0c;即使在main.c中声明、引用了&#…

PCL从理解到应用【04】Octree 原理分析 | 案例分析 | 代码实现

前言 Octree 作为一种高效的空间分割数据结构&#xff0c;具有重要的应用价值。 本文将深入分析 Octree 的原理&#xff0c;通过多个实际案例帮助读者全面理解其功能和应用&#xff0c;包括最近邻搜索、半径搜索、盒子搜索以及点云压缩&#xff08;体素化&#xff09;。 特性…

搞懂负载均衡,零基础也可以!

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是鱼皮。 周末在家写代码&#xff0c;无意中跟朋友提了下 LB&#xff0c;还说 LB 好的呱呱叫。 朋友笑了笑&#xff0c;问我 LB 是谁&#xff1f; 我解释…

加密软件|让数据传输更安全

加密软件在当今数字化时代扮演着至关重要的角色&#xff0c;它们通过先进的加密算法和技术&#xff0c;确保数据在存储、传输和分享过程中的安全性&#xff0c;从而保护个人隐私和企业机密。一、加密软件的基本作用数据加密&#xff1a;加密软件通过应用复杂的加密算法&#xf…

Python转换PDF为PowerPoint演示文件

PDF文件以其跨平台兼容性和版面固定性成为了分享和存储文档资料的首选格式。然而&#xff0c;在需要进行生动、互动性强的演示时&#xff0c;PDF的静态特性便难以满足个性化演示需求。将PDF文件转换为PowerPoint演示文稿可以解决这一问题。PowerPoint不仅提供了丰富的动画和过渡…

网关设备BL122实现Modbus RTU/TCP转Profinet协议

Modbus与Profinet是两种广泛应用于工业自动化领域的通信协议&#xff1a;Modbus因其简单性和兼容性&#xff0c;在许多工业设备中得到广泛应用&#xff1b;而Profinet提供了高速、高精度的通信能力&#xff0c;适合于复杂控制系统和实时应用&#xff0c;但两者之间的差异导致了…