C++面向对象(上)

news2024/9/22 21:27:22

文章目录

  • 前言
  • 1.面向过程和面向对象初步认识
  • 2.引入类的概念
    • 1.概念与用法
    • 2.类的访问限定符及封装
    • 3.类的作用域和实例化
    • 4.类的大小计算
    • 8.this指针
  • 3.总结

前言

本文将对C++面向对象进行初步介绍,引入类和对象的概念。围绕类和对象介绍一些基础知识,为以后深入学习C++打基础


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

之前C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

洗衣服为例
面向过程是把洗衣服的每个步骤都分析确定好,最终完成洗衣服的任务。
在这里插入图片描述


面向对象是把洗衣服抽象成4个对象:人+衣服+洗衣机+洗衣粉。具体过程是人将衣服和洗衣粉倒入洗衣机,启动洗衣机。至于洗衣粉和衣服这么放入洗衣机的,洗衣机是怎么洗的这些都漠不关心。
在这里插入图片描述


2.引入类的概念

1.概念与用法

为了支持面向对象的思想C++引入了类的概念,C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。这个时候结构体就不能称为结构体体了,应该称为类。类可以简单看作是一种特殊的结构体。

C++中常用关键字class来定义类

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

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


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

在这里插入图片描述


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

在这里插入图片描述
在这里插入图片描述


一般来说,更建议使用第二种用法.


2.类的访问限定符及封装

之前C语言的结构体中的成员变量访问不收限制比较自由,但是C++比较讲究封装性,C++为了保证其封装性引入了访问限定符的概念。

在这里插入图片描述

【访问限定符说明】
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问 (此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止.
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)

在C++中也是支持用struct来定义类的,但是一般不建议使用


C++中strcut和class的区别是什么?

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序再介绍。


关于封装这里简单说一下

C++面向对象的三大特性:封装、继承、多态。在类和对象阶段主要就是围绕着封装特性学习。那什么是封装呢?封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。对于电脑内部的细节用户不需要关心.在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用


3.类的作用域和实例化

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

之前在类外定义函数时就使用了::来指明函数属于哪个类域
在这里插入图片描述


类的实例化

用类类型创建对象的过程,称为类的实例化。类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量.做个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间.

在这里插入图片描述


4.类的大小计算

类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?类中只保存成员变量,成员函数存放在公共的代码段。因为每个对象的数据都是独立的,也就是成员变量是独立的,但是成员函数每个类都会调用这是共享的。一个类的大小,实际就是该类中”成员变量”之和,不过是按照内存对齐规则来分配成员变量的空间。关于内存对齐之前C语言的博客有过介绍,这里不过多的解释。注意空类的大小,空类比较特殊,编译器给了空类1个字节来唯一标识这个类的对象存在过。

在这里插入图片描述


8.this指针

在介绍this指针之前,我们来看一段代码。

在这里插入图片描述

init函数是怎么区分对象a1和a2的,它怎么知道自己是被哪个对象调用的呢?其实C++中通过引入this指针解决该问题,即:C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

当然this指针也可以显示调用,当然这样没必要
在这里插入图片描述


思考两个问题:1.this指针存在于哪里?2. this指针可以为空吗?
对于第一个问题,this指针是作为成员函数的隐藏参数的,所以它也是属于函数参数。既然是函数参数那么它就存在于函数栈帧中也就是栈上。对于第二个问题,我们来看看这样的两段代码。

代码1
在这里插入图片描述
代码2
在这里插入图片描述

代码1是不会崩溃的,代码2是会发生崩溃的,这是为什么呢?变量虽然是空指针,但是代码1中的this指针并没有发生解引用的行为,仅仅是用来调用Print函数,让Print函数知道自己是被哪个对象调用的,但是代码2是访问到了类中的成员,访问类中的成员是需要this解引用的,这样一来就会对空指针解引用引发错误。所以this指针在代码1的情况下可以为空,但是在代码2这样的情况下就不能为空。

其实我们写下这样的代码也是没问题的
在这里插入图片描述

因为实际上并没有发生解引用的行为,如果将*p赋值给某个变量的化,产生了写入的动作这样才算是发生了解引用的行为。


3.总结

在C语言结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据的方式是分离开的,而且实现上相当复杂一点,可能涉及到大量指针操作,稍不注意可能就会出错。C语言的风格相对来说比较自由,但是这种自由就要求程序员对代码的掌握的比较细致周全。
C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。用户在使用时也不必关注底层实现细节,而且每个方法不需要传递结构体指针的参数了,编译器编译之后该参数会自动还原,即C++中 函数成员参数是编译器维护的,C语言中需用用户自己维护。

补充一点在C++中类的成员的命名方式

class Date
{
public:
 void Init(int year)
 {
 // 这里的year到底是成员变量,还是函数形参?
 year = year;
 }
private:
 int year;
};

为了避免将类中的成员变量和成员函数参数搞混淆,我们一般尽量不要将变成员变量和成员函数的参数命名一样,推荐下面的这样的做法


class Date
{
public:
 void Init(int year)
 {
   _year = year;
 }
private:
 int _year;
};

这就是一种比较好的命名风格


以上内容,如有错误欢迎指正!

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

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

相关文章

【数据结构】————栈

文章目录前言栈是什么,栈的特点实现栈的基本操作栈的相关操作声明1.创建栈2.对栈进行初始化3.销毁栈4.判断栈是否为空5.压栈操作6.删除栈顶元素7.取出栈顶元素8.计算栈内存放多少个数据总结前言 本文主要讲述特殊的线性表——栈: 栈是什么,栈…

学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现

绪论: 本篇文章使结构体章节后的习题,如果你对C语言有问题,或者结构体有什么问题不妨看看我之前所写的文章(章回体),对于文件管理和内存分配问题我将在后面补上,对于这个学生信息管理系统我用了多种方法和…

五【Spring】控制反转(IOC)

目录一 Ioc控制反转1.1 概述1.2 依赖注入二 传统依赖的问题2.1 在传统的项目中三 引入Spring解决3.1 Spring配置文件中Bean属性3.2 Bean的作用域3.3 项目案例四 基于xml的依赖注入(注意有参 无参的构建)4.1 设置注入4.2 构造注入(依赖有参构造…

【Java面试总结】MySQL篇·优化篇

【Java面试总结】MySQL篇SQL优化篇1.该如何优化MySQL的查询?2.怎样插入数据才能更高效?3.表中包含几千万条数据该怎么办?4.MySQL的慢查询优化有了解吗?5.说一说你对explain的了解6.explain你一般关注什么?1.该如何优化…

【Linux】网络编程 - Socket套接字/基于UDP的网络通信

目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…

【题外话】如何拯救小米11Pro这款工业垃圾

1 背景媳妇用小米11Pro手机,某日不慎摔落,幸好屏幕未碎,然而WiFi却怎样都无法打开,初以为是系统死机,几天依旧故障无法使用。现在的手机没有WiFi功能,就无法刷抖音、看视频,就是鸡肋了。后抽空去…

全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记

欢迎关注「全栈工程师修炼指南」公众号点击 👇 下方卡片 即可关注我哟!设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识“ 花开堪折直须折,莫待无花空折…

【2.19】算法题2:贪心算法、动态规划、分治

题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。方法一:贪心算法原理:若当前指针所指元素之前的和小…

学生和老师-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-4】学生和老师 【案例介绍】 1.案例描述 在班级中上课时,老师在讲台上讲课,偶有提问,会点名学生回答问题。虽然老师和学生都在讲话,但讲话的具体内容却不相同。本案例要求使用抽象类的知识编写一个程序实现老师上课的情…

Allegro如何快速清除多余的规则设置操作指导

Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…

真实景观渲染技巧【Three.js】

受到一些很棒的 three.js 演示、与 covid 相关的旅行禁令以及可能在 pinterest 上花太多时间看美丽的旅行照片的启发——我开始看看我是否可以使用 three.js 和r3f在浏览器中渲染一个令人信服的风景场景。 推荐:将 NSDT场景编辑器 加入你的3D开发工具链。 在过去一个…

AnLogicFPGA设计的时序约束及时序收敛

本篇博文讲了三个内容:时序约束基本概念、时序约束命令、时序收敛技巧 时序约束基本概念 时序设计的实质就是满足每一个触发器的建立(setup)时间和保持(hold)时间。 建立时间(Tsu) 触发器的时钟信号沿到来以前&…

零信任-新华三H3C零信任介绍(12)

​目录 ​新华三零信任是什么? 新华三零信任架构特点 新华三零信任架构 新华三零信任架构适用场景 新华三零信任的未来发展展望 新华三零信任是什么? 建立新边界 全面身份化。新华三贯彻“永不信任,始终验证”的原则,通过对…

JavaWeb7-线程状态(生命周期)及转换过程

目录 1.所有线程状态(共6种) ①NEW-新建状态 ②RUNNABLE-运行状态 RUNNABLE(得到时间片运行中状态) READY(已经保存了上下文,但还未得到时间片的就绪状态)。 ③BLOCKED-阻塞状态 ④WAITI…

使用NutUI创建小程序和H5界面

做开发的时间长了,技术都是通用的,创建小程序和H5界面有很多的UI,本章节演示使用NutUI来创建,官网,NutUI - 移动端 Vue3 小程序组件库 1.使用HBuilder X创建一个uni-app的程序,如图所示 2. 安装UniNutUI …

nvm的使用与坑

1、nvm 介绍 Node Version Manager - 符合 POSIX 标准的 bash 脚本,用于管理多个活动的 node.js 版本 官网为 nvm-windows,点击这里进行下载 2、使用场景 比如有几个项目,这些项目的需求都不太一样,导致了这些个项目需要依赖的…

论文投稿指南——中文核心期刊推荐(管理学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

多彩的声音-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-3】多彩的声音 记得 关注,收藏,评论哦,作者将持续更新。。。。 【案例介绍】 案例描述 设计和实现一个Soundable发声接口,该接口具有发声功能,同时还能调节声音大小。 Soundable接口的这些功能将由有3种声音…

【C++的OpenCV】第一课-opencv的介绍和安装(Linux环境下)

第一课-目录一、基本介绍1.1 官网1.2 git源码1.3 介绍二、OpenCV的相关部署工作2.1 Linux平台下部署OpenCV一、基本介绍 1.1 官网 opencv官网 注意:官网为英文版本,可以使用浏览器自带的翻译插件进行翻译,真心不推荐大家去看别人翻译的&am…

vue实现xml在线编辑功能

先看效果 避免误会 这是一个在线编辑器 我们可以在这上面随意的编写xml代码格式 我们修改上面的内容之后 就可以在控制台输出内容 如果这正是您想要的东西 那就可以先创建一个vue项目 我们先引入依赖 npm install brace -S npm install element-ui -S npm install vue-cli…