C++ 类和对象(上)

        再C++中,我们使用类定义自己的数据类型。通过定义新的类型来反映待解决的问题中的各种概念,可以使我们更容易编写,调试和修改程序。

类定义格式

        首先类的定义格式和结构体差不多,而结构体的那一套语法也可以在C++中使用。class是定义类的关键子,然后{}是主体,类结束时的分号也不能省略,这和结构体差不多。只不过,现在哦我们可以在类里面定义函数了。

        像这样,我们就定义好了一个日期类。可以发现,我们把成员变量都定义了一个关键字private,这在英语里面是个人的私人的意思。到了C++中,这里也是私有的意思。意思就是不能在类外面访问,只能在类里面的函数访问。我们把函数设成了public(公有的),就是我们定义的类的函数可以被外部访问。

        为了区分成员变量,我们把成员变量一般都使用下划线加变量名来定义,所以我定义的成员变量都有一个下划线。

        C++中也可以定义类,C++中兼容C的struct的用法,并新增了它有class的能力,只是如果没有给它的成员加上访问限定符时,它会默认为公有的。一般情况下,我们还是推荐使用class定义类。

内联函数(inline)

        将函数定义为内联函数,通常就是将它在每个调用点上“内联地展开”。它的作用是避免函数调用的开销。首先我们知道,调用函数是在栈上开辟了一段空间,然后再执行。对于一些频繁操作的函数来说,我们就可以把它设置成为内联函数,让它在调用的位置展开,就节省了很多时间。

        但是,内联函数一般都只用于优化规模较小,流程直接,频繁调用的函数。比如我们的一些交换函数等等,这些函数比较简单,就可以设置为内联函数。但是当我们不小心把一个很复杂的函数设置成为了内联函数的时候,怎么办呢? 其实内联说明只是向编辑器发出一个请求,编译器可以忽略掉这个请求。编译器可以自动识别一些函数是否能编译成内联函数。

类域

        类定义了一个新的作用域,类的所有成员都在类中。但是我们在类中定义函数的时候还是经常想把函数定义放在类外面。这个时候我们就需要去使用作用域操作符::去声明函数属于哪一个类。

看上面的代码,我们只在类里面声明了初始化函数Init,并没有定义它,当我们在类外面去定义它的时候就需要用到作用域访问符::。它是由两个冒号组成。

实例化概念

        用类在物理内存中创建对象的过程,叫做类的实例化对象。

        类是对事物的一种抽象描述,在我们定义它的时候,它还没有被创造出来,是一个模型化的东西,限定了类有哪些成员变量,可以进行什么操作。用类实例化出对象后,才会产生空间消耗。

举个例子:实例化对象就好比我们再造房子,房子的布局,大小,房间等都在图纸上画好了,但是房子还没有建造出来,不能够住人,当实例化对象之后,就好比建好了房子,一个真正的实物及u出现了,才产生空间是消耗。

成员的大小

        当我们定义了一个类之后,我们要怎样计算它的大小呢?我们只需要知道,类里面定义的函数都是放在公共区域的,因此当我们在计算类的大小时,只需要计算类成员变量的大小就行了。然后这里的类成员大小的计算方法和C语言中结构体的计算方法相同,我在前面已经讲过了,大家可以跳转下面的链接去看一看。 

https://mp.csdn.net/mp_blog/creation/editor/137196424

this指针

Date类中有两个函数,当我们调用两个函数的时候,它是怎么区分d1和d2这两个对象的呢?在这里面,隐藏着一个this指针,它们分别指向d1和d2。然后调用函数的时候,再使用this指针去进行赋值操作。

当然,我们再定义函数的时候,不用使用this指针,编译器会自动加上的。

C++中规定不能在形参和实参的位置写this指针,只能在函数体内使用this指针,否则编译器会报错。 

        根据前面学习的知识,我们可以看一看上面这道题选什么。首先我们分析,我们定义了一个A类型的指针为空,然后我们去调用它的函数,是否能成功呢?答案是能。所以说这道题选择B。因为我们前面说过,我们的函数是放在公共区域的,我们对p进行解引用是访问的公共空间,并没有去访问A所指向的空间,所以程序不会崩溃。至于编译报错,我们的语法都没有什么问题,所以编译器并不会报错。

        现在这个情况下就会报错了,因为我们在Print函数中增加了一行代码去访问p中的_a,它会解引用去访问空指针的空间,空指针是不允许被访问的,所以程序会崩溃。

        第三个问题答案选A。这和编译器有关系,也有可能存在寄存器中。

 

 

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

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

相关文章

oracle数据库的plsql免安装版安装

这个是连接oracle数据库的,注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql,发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压,并复制文件路径。 修改tool…

[Python学习篇] Python搭建静态web服务器

Python内置的web静态服务器 Python内置的http.server模块可以快速启动一个简单的HTTP服务器。 在Python 3中,打开命令行或终端,在你想要作为静态服务器根目录的文件夹下,运行以下命令: python -m http.server 8000 这将会在…

纯vue+js实现数字0到增加到指定数字动画效果功能

关于数字增加动画效果网上基本上都是借助第三方插件实现的,就会导致有的项目安装插件总会出问题,所有最好使用原生vue+js实现,比较稳妥 纯vue+js实现数字0到增加到指定数字动画效果功能 vue+js 实现数字增加动画功能 效果图 其中,关于数字变化的间隔时间,延时效果都可…

澳门建筑插画:成都亚恒丰创教育科技有限公司

澳门建筑插画:绘就东方之珠的斑斓画卷 在浩瀚的中华大地上,澳门以其独特的地理位置和丰富的历史文化,如同一颗璀璨的明珠镶嵌在南国海疆。这座城市,不仅是东西方文化交融的典范,更是建筑艺术的宝库。当画笔轻触纸面&a…

一个spring boot项目的启动过程分析

1、web.xml 定义入口类 <context-param><param-name>contextConfigLocation</param-name><param-value>com.baosight.ApplicationBoot</param-value> </context-param> 2、主入口类: ApplicationBoot,SpringBoot项目的mian函数 SpringBo…

(三)Redis持久化,你真的懂了吗?万字分析AOF和RDB的优劣 AOF的刷盘、重写策略 什么叫混合重写 MP-AOF方案是什么

引言 —— Redis基础概念 Redis概念&#xff1a;Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对&#xff08;key-value&#xff09;数据库。 为什么会出现Redis呢&#xff1f;它的到来是为了解决什么样的问题&#xff1f; Redis 是一个NOSQL类型…

操作系统真象还原:创建文件系统

14.2 创建文件系统 14.2.1 创建超级块、i结点、目录项 超级块 /** Author: Adward-DYX 1654783946qq.com* Date: 2024-05-07 10:18:02* LastEditors: Adward-DYX 1654783946qq.com* LastEditTime: 2024-05-07 11:24:50* FilePath: /OS/chapter14/14.2/fs/super_block.h* Des…

WPF学习(6) -- WPF命令和通知

一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…

CCSI: 数据无关类别增量学习的持续类特定印象| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 数据无关类别增量学习的持续类特定印象 01 文献速递介绍 当前用于医学影像分类任务的深度学习模型表现出令人鼓舞的性能。这些模型大多数需要在训练之前收集所有的…

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

在RHEL9.4上启用SFTP服务

FTP存在的不足&#xff1a; 明文传输 FTP传输的数据&#xff08;包括用户名、密码和文件内容&#xff09;都是明文的&#xff0c;这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制&#xff0c;容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…

读人工智能全传12人工智能导致的问题1

1. 人工智能会导致什么问题 1.1. 人工智能是一门通用技术&#xff1a;它的应用仅仅受限于我们的想象 1.1.1. 所有的技术都可能产生意想不到的效果&#xff0c;未来几十年甚至几百年内都存在可能性 1.2. 所有的技术都可能被滥用 1.2.1. 我们的无名氏祖先率先用上了火&#x…

编写商品列表和商品编辑和商品新增页面

addvue <template><!-- 传过来的id --> <!-- {{ $route.query.id }} --> <el-formref"FormRef"style"max-width: 600px":model"FormData":rule"rules"status-iconlabel-width"auto"class"demo-r…

Golang | Leetcode Golang题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; type MyQueue struct {inStack, outStack []int }func Constructor() MyQueue {return MyQueue{} }func (q *MyQueue) Push(x int) {q.inStack append(q.inStack, x) }func (q *MyQueue) in2out() {for len(q.inStack) > 0 {q.outStack…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

昇思25天学习打卡营第20天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成个性化音乐 实验简介 MusicGen是Meta AI提出的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量音乐。该模型基于Transformer结构&#xff0c;分为三个阶段&#xff1a;文本编码、音频token预测和音频解码。此实验将演示如何使用MindSpo…

搞定ES6同步与异步机制、async/await的使用以及Promise的使用!

文章目录 同步和异步async/awaitPromisePromise的概念 同步和异步 ​ 同步&#xff1a;代码按照编写顺序逐行执行&#xff0c;后续的代码必须等待当前正在执行的代码完成之后才能执行&#xff0c;当遇到耗时的操作&#xff08;如网络请求等&#xff09;时&#xff0c;主线程会…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

如何解决VMware 安装Windows10系统出现Time out EFI Network...

一、问题描述 使用VMware 17 安装windows10出现如下图所示Time out EFI Network… Windows10镜像为微软官方下载的ISO格式镜像&#xff1b; 二、问题分析 VMware 17 默认的固件类型是UEFI(E)&#xff0c;而微软官网下载的Windows10 ISO格式镜像不支持UEFI(E)&#xff0c;支…