C++类与对象(上部曲)

目录

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

类的引入

类的定义

类的两种定义方式:

1. 声明和定义全部放在类体中

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

类的访问限定符及封装

1 访问限定符

2 封装

类的实例化

类对象的存储方式

this指针


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


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

比如炒菜(注重过程):准备蔬菜->清洗切刀->下锅烹煮->碟碗盛放

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

再比如空气炸锅来完成食物,(注重对象):人、食物、空气炸锅

人只需要将食物送进空气炸锅,等待食物可食用即可,我们不需要关心空气炸锅怎么将食物做好

整个过程是由人、空气炸锅、食物三个对象之间的交互完成的

类的引入


C语言结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数
以栈的实现为例,具体实现我就不写了,只构造大概框架

以下结构体的定义,在C++中更喜欢用class来代替

struct Stack
{//成员函数void Init(){a = nullptr;top = capacity = 0;}void Push(int x){//……}//成员变量int* a;int top;int capacity;
};int main()
{Stack st;st.Init();//访问更便利st.Push(1);st.Push(2);return 0;
}

类的定义
 

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

类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数


类的两种定义方式:


1. 声明和定义全部放在类体中

注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
以栈为例:


class Stack
{
public:void Init(){a = nullptr;top = capacity = 0;}void Push(int x){//……}private:int* a;int top;int capacity;
};

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

更推荐这种
注意:成员函数名前需要加类名::

因为类定义了一个新的作用域,需要使用 ::作用域操作符指明成员属于哪个类域
 

//Stack.hclass Stack
{
public:void Init();void Push(int x);
private:int* a;int top;int capacity;
};
//Stack.cpp#include"Stack.h"
void Stack::Init()
{a = nullptr;top = capacity = 0;
}void Stack:: Push(int x)
{//……
}

类的访问限定符及封装


1 访问限定符
 

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

1 public修饰的成员在类外可以直接被访问

2 protectedprivate修饰的成员在类外不能直接被访问(此处protected和private是类似的)
访问权限作用域该访问限定符出现的位置开始直到下一个访问限定符出现时为止/后面没有访问限定符,作用域就到 } 即类结束
3 class默认访问权限为private,struct为public
 

2 封装

封装:将数据操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互,也就是通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用
 

类的实例化
 

类类型创建对象的过程,称为类的实例化
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类
有分配实际的内存空间
来存储它
实例化出的对象 占用实际的物理空间,存储类成员变量

形象点来说,类就像房子的设计图纸,设计出需要什么,而实例化出的对象就是实体的房子

class Stack
{
public:void Init(){a = nullptr;top = capacity = 0;}void Push(int x){//……}private:int* a;int top;int capacity;
};int main()
{Stack st;//实例化return 0;
}

类对象的存储方式

每个对象中只保存成员变量,成员函数存放在公共代码区
 

this指针
 

我们先看一段日期类Date的代码:

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(2023,7,22);d2.Init(2023, 7, 23);d1.Print();d2.Print();return 0;
}

在调用Init函数和Print函数时,它们是怎么精准区分不同对象的呢?知道该为哪个对象进行操作呢?

C++中通过引入this指针解决该问题:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数
,即this指针(调用函数的对象的地址,指向该对象),让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问
 

this指针的特性


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

其实this指针作为函数的形参是不可用显示化的,但是可以在成员函数内部显示的使用,同时要注意不能对this指针本身进行修改

 

 

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

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

相关文章

已解决-使用Adobe Acrobat去除PDF水印

这个方法只能去带颜色的水印&#xff0c;灰色的去不了&#xff0c;等我有空时候&#xff0c;再写一篇使用PS去除水印的方法&#xff0c;也非常简单。敬请期待 安装软件 网上下载安装Adobe Acrobat Pro DC 安装Adobe PDF打印机 点击“添加打印机” 选择“我的打印机未列出”…

Hadoop——HDFS的Java API操作(文件上传、下载、删除等)

1、创建Maven项目 2、修改pom.xml文件 <dependencies><!-- Hadoop所需依赖包 --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.0</version></dependency&…

【C++】引用

1.引用的基本语法 2.引用注意事项 int &b&#xff1b;//错误 int &ba&#xff1b;//正确 3.引用做函数参数 int temp a&#xff1b; ab&#xff1b; btemp&#xff1b; 4.引用做函数返回值 出现问题&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p…

【计算机网络】网络基础

文章目录 1. 网络的发展2. 认识网络协议2.1 协议栈在所有操作系统中是统一的2.2 协议分层2.3 协议各层的功能2.4 协议分层的好处 3. 具体的网络协议栈3.1 OSI七层模型3.2 TCP/IP五层模型 4. 网络通信基本流程4.1 同局域网的两台主机通信4.2 跨局域网的两台主机通信 5. 网络中的…

JMeter的使用(2)

JMeter生成测试报告使用的是Ant(Maven)构建工具来生成HTML的测试报告。 ant执行的条件是需要有build.xml的文件的&#xff0c;build.xml文件里面主要编写三个内容&#xff1a; 1、定义了被执行的测试脚本 2、定义了测试报告的目录 3、定义了自动发送邮件 HTTP COOKIE管理器&am…

Spring详解(学习总结)

目录 一、Spring概述 &#xff08;一&#xff09;、Spring是什么&#xff1f; &#xff08;二&#xff09;、Spring框架发展历程 &#xff08;三&#xff09;、Spring框架的优势 &#xff08;四&#xff09;、Spring的体系结构 二、程序耦合与解耦合 &#xff08;一&…

【安全狗】linux免费服务器防护软件安全狗详细安装教程

在费用有限的基础上&#xff0c;复杂密码云服务器基础防护常见端口替换安全软件&#xff0c;可以防护绝大多数攻击 第一步&#xff1a;下载服务器安全狗Linux版&#xff08;下文以64位版本为例&#xff09; 官方提供了两个下载方式&#xff0c;本文采用的是 方式2 wget安装 方…

浏览器对跨域请求携带Cookie的方法

文章目录 一、前后端协商配置1.1 前端页面搭建1.2后端服务器搭建 二、配置允许跨域浏览器三、Chrome浏览器安装ModHeader插件 企业开发时会分开发环境、测试环境以及生产环境&#xff0c;但是有的企业开发只有真正发布到线上的生产环境的流程才会严格配置&#xff0c;有的项目开…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…

《深入理解计算机系统》(美)布赖恩特(Bryant,R.E.) 等

适合对象&#xff1a;对计算机感兴趣的朋友。 需要相关资料的可私信我。 持续更新中&#xff1a; 第一章&#xff1a;计算机系统漫游 主要知识点&#xff1a;解读全书结构框架&#xff0c;解释OS的原理和相关硬件软件。计算机系统是由硬件和系统软件组成&#xff0c;共同协作…

Linux小程序:倒计时和进度条

Linux小程序 在Linux中我们实现两个小程序来体会\r和\n的区别&#xff0c;以及缓冲区是什么&#xff1f; 文章目录 Linux小程序前言回车和换行的区别缓冲区 小程序的实现倒计时程序进度条程序 总结 前言 回车和换行的区别 对于 \r 和 \n 的理解&#xff1a; \n 表示换行且回…

Sentinel授权规则与规则持久化

&#x1f333;&#x1f333;&#x1f333;&#x1f333;&#x1f333;&#x1f333;&#x1f333; 学习授权规则前&#xff0c;先想想SpringCloud Gateway的黑白名单&#xff0c;请求过网关&#xff0c;gateway会去鉴权。但如果有人把微服务信息泄露出去了呢&#xff1f;此时微…

前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;深入探索前端框架中的Diff算法&#xff1a;优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法&#xff1a;Vue的diff算法&#xff1a; Diff算法在…

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…

C# 未提供必须形参对应的实参

这个问题是在写观察者模式中遇到的一个问题。 具体的代码可以到《设计模式&#xff08;十五&#xff09;之观察者模式》中下载&#xff0c;下边只是部分代码。 我在抽象类中定义了构造函数&#xff0c;代码如下&#xff1a; using System; using System.Collections.Generic;…

设计模式-享元模式在Java中的使用示例-围棋软件

场景 享元模式 简介 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 例如在一个文本字符串中存在很多重复的字符&#xff0c;如果每一个字符都用一个单独的对象来表示&#xff0c;将会占用 较多的内存空间…

【案例教程】基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

Vue中值的传递(父传子,子传父,子父同步)

1.父组件->子组件传递数据 ①父组件通过 v-bind: 属性绑定的形式&#xff0c;把数据传递给子组件 如果不需要动态绑定&#xff0c;则可以直接写number“张三” ②子组件中&#xff0c;通过props接收父组件传递过来的数据 2.子组件->父组件传递数据 1.在子组件中&#xf…

实现外部缓存-Redis

目录 实现 RedisTemplate RedisTemplate的序列化 RedisSerializer 创建Redis缓存配置类 测试使用 创建配置类 创建注解测试实体 创建配置文件 创建单元测试类进行测试 实现 RedisTemplate XXXTemplate 是 Spring 的一大设计特色&#xff0c;其中&#xff0c;RedisTe…

【基础算法】——双指针算法

文章目录 一、算法原理二、算法实战1. 力扣283 移动零2. 力扣1089 复写零3. 力扣15 三数之和4. 力扣18 四数之和 三、总结 一、算法原理 双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向(快慢指针)或者相反方向&#xff08;…