类和对象(初)

目录

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

二、类的引入

 命名规则

三、类的定义

四、访问限定符

五、类的作用域

六、类的实例化

七.类对象模型


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

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,一经查实,立即删除!

相关文章

Java:更适合小白的Java语言开发规范(根据阿里巴巴Java开发手册总结整理)

一 代码原则 通过所有测试&#xff08;Passes its tests&#xff09;&#xff1a;强调的是外部需求&#xff0c;这是代码实现最重要的​尽可能消除重复 (Minimizes duplication)&#xff1a;代码的模块架构设计&#xff0c;保证代码的正交性&#xff0c;保证代码更容易修改尽可…

面试题目分享

学习目标&#xff1a; 从面试了解自己的不足。 学习内容&#xff1a; 1.你会什么语言&#xff1f; 我该如何回答&#xff0c;我会java&#xff0c;c&#xff0c;c等&#xff0c;在工作中我会用到合适的语言。 牛逼吹的大话 尊敬的面试官&#xff0c;我精通Java和Python&…

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

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

Android表格布局的概念与属性

表格布局的概念与属性 表格布局&#xff08;TableLayout&#xff09;是以行、列的形式来管理控件的&#xff0c;类似与表格。如图所示&#xff0c;是一个表格布局。TableLayout继承自LinearLayout&#xff0c;支持LinearLayout所支持的全部属性&#xff0c;默认为垂直方向的Li…

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

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

预测算法面试

这次面试的是一个预测算法的岗位。虽然我对供应链相关的预测很厌烦了&#xff0c;但是这个不是供应链领域的&#xff0c;感觉应该还好。 首先在介绍工作经历和项目部分&#xff0c;这次面试没有上来没有条理乱说一气&#xff0c;而是预测目标、算法架构、各种使用特征这些分层…

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

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

ubuntu 换源

sudo apt update 错误如下 Ign:1 http://security.ubuntu.com/ubuntu focal-security InRelease Ign:2 http://us.archive.ubuntu.com/ubuntu focal InRelease Err:3 http://security.ubuntu.com/ubuntu focal-security Release SECURITY: URL redirect target…

人工智能讲座——深度学习实现行人重识别

目录 一、引言 二、深度学习基本概念 三、损失函数 一、引言 1、在不同的监控检测同一行人&#xff0c;实现行人的监测。 2、文本描述行人特征。根据文本描述寻找行人。 是图像检索问题&#xff0c;检索对象是行人。 标本图像与待查询图像相似度对比&#xff0c;相似度从…

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

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

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

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

Linux程序替换

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

代码优化方法记录

每次代码 review 之后&#xff0c;对 review 的情况进行总结记录&#xff0c;产出实际经验&#xff0c;方便组内学习、分享。 1、提取公共内容 公共内容要提取&#xff0c;避免重复编写&#xff1b; 2、css 色值使用变量 css 中的色值、字体&#xff0c;都换成组件库中的变…

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

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

docker/podman 安装nacos

设置环境变量&#xff0c;创建卷目录&#xff1a; VOL_HOME/data/volumes; mkdir -p $VOL_HOME/nacos/conf; mkdir -p $VOL_HOME/nacos/logs; mkdir -p $VOL_HOME/nacos/data; chown -R 200 $VOL_HOME/nacos; 创建nacos数据库&#xff0c;运行脚本&#xff1a; $VOL_HOME/na…

做实验的顺序-因人而异,只是记录自己的想法,,

1先去设计模型&#xff0c;运行。 2调参&#xff0c;最近发现超参数更重要。选择出来一个好的超参数&#xff08;为消融实验做准备&#xff09;。 &#xff08;友友们&#xff0c;如果不是自己设计的什么重要超参&#xff0c;尽量参考已有的论文&#xff0c;这样就不用做很多…

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;特别是在…