C++ 类和对象 3

news2024/12/26 3:50:51

构造函数扩展

构造函数体内的赋值:构造函数一般是用于类对象的初始化的,但严谨来说并不是成员变量的初始化,内置类型的初始化是在生成的同时赋值而且仅有一次,但是在构造函数体内是能对成员变量进行多次赋值的。所以在函数体内的仅是赋值而不是初始化。

成员变量的初始化:在C++中有一些变量是只能使用初始化来赋值的,初始化之后改变量是无法被再次赋值的,这些变量就无法在构造函数体内完成赋值所以构造函数针对这些变量还有一个初始化列表。

这是一个完整的初始化列表的构造函数,这个构造函数的函数体是空的什么都没有完全依靠初始化列表完成对成员变量的初始化,列表的开始用:后面每一个成员用逗号隔开,列表中每个成员变量只能出现一次,类似变量的引用,const变量,自定义类型成员且没有默认构造函数的这类只能初始化的变量便可以使用初始化列表来初始化。

一般构造函数中能使用初始化列表初始化的都会尽量使用初始化列表,当然像需要有额外操作如开辟空间之类的也是可以在函数体中实现,构造函数会先走初始化列表然后再进入函数体,注意初始化列表的初始化顺序与我们写的初始化列表的成员变量的顺序无关而是按照在类中声明的顺序初始化的

这里我定义的顺序是_a->_b->_c那么只要包含这三个成员变量就肯定按照这个顺序初始化,无关初始化列表的顺序。

explicit关键字

内置类型中是存在隐式类型转化的在相近类型之间进行赋值的时候会通过隐式类型转化生成一个目标类型的中间变量再完成赋值,自定义类型当我们有全缺省构造函数或者除了一个参数没有默认值其余都有的构造函数或只有一个参数的构造函数的时候就可以发生赋值时的隐式类型转化,

这里我实现了一个单参数的构造函数当我用一个符合上面函数的值创建这个类对象的时候便会发生隐式类型转化同过这个构造函数创建一个_a为0的临时对象再调用赋值运算符重载来完成这次的自定义类型的赋值。

可是当我们使用隐式类型转化来创建新对象的时候其一这个代码的可读性就不太好,C++是从C中拓展而来的这种类型相差如此大的变量类型能如此不符合C语言的习惯,同时效率上是有缺失的,这里先是构造了一个临时对象再进行赋值构造而我们可以直接构造的不需要走第二次的赋值构造的,若是一些构造有些消耗的都会些效率上的损失。

那么我们这里在声明这个构造函数的时候就可以加上explicit关键字

这样子就限定了不能进行隐式类型转化也就杜绝了这种代码的出现

static成员

通过static修饰的变量和函数会存放在静态区,并且其相当于全局的,拥有和全局变量和函数一样的作用域和生命周期。

若是我们在类中声明了静态成员与一般变量函数一样也是存放在静态区的,并且是类中静态成员函数是没有this指针的所以也不能调用类中的非静态成员函数和非静态变量,静态成员变量还不能在类中定义只能在外部定义,类中只能对静态成员变量进行声明,在进行声明时不需要加static修饰。

类中的静态成员是被所有类对象所公有的,无论存在多少个类对象,静态成员都仅有一份,每个对象访问的都是同一个静态成员。

友元

类使用划分公有,私有,保护来让类获得封装的特性,但可能会有特定的函数或者类需要访问这些隐藏的数据或函数的情况,这里C++就为这种情况设计出了友元的概念,我们可以将函数或者其他类设置成某一个类的友元函数或者友元类,这个函数或者类就可以如同成员函数一样访问类中的所有成员。

友元函数

在C++中我们打印到屏幕和从键盘中提取数据一般使用cout<<和cin>>的方式,但是输入输出流对象函数相应第一个参数分别是ostream和istream的类对象,但是在类中每个函数都规定第一个参数是隐含的this指针作为参数,所以在类中实现便行不通,但是我们进行输出和输入都肯定需要访问类中的成员变量的,而一般的成员变量都是私有或者保护的,所以我们只能使用友元函数的方式,在外部实现流插入操作符和流提取操作符的重载,在类型声明成友元。

这是对流插入的重载我在外面实现在类中进行友元的声明即声明加friend,这样这个函数便能通过对象名字来完成对私有和保护成员的访问了。

友元函数是不受类作用域的限制的,友元函数能在任何地方实现,并通过对象完成对对象内部所有成员的访问,但是友元函数不能使用const修饰。

友元类

友元类与函数的声明相似,以上面类为例,若要将Add这个类声明为其他类的友元类只需要在类的任意地方加上“friend class Add”即可。

声明完之后那么我的Add的所有函数就自动成为这个类的友元函数可以访问这个类的所有成员。友元是单向的Add类可以访问这个类的所有成员但是这个函数并不能访问Add类的私有保护成员。

友元关系不能传递,A是B的友元,B是C的友元并不代表A是C的友元。即朋友的朋友并不是朋友。

友元不能继承,若A是B的友元,C继承B,A也不是C的友元。

内部类

我们可以在一个类内部再定义一个类,这个再定义的类就是内部类。内部类天生是外部类的友元类,但是调用外部类的static成员时并不需要添加类名或者对象名。

外部类对内部类的访问权限是没有改变的,就如一般从外部访问类的对象一样,不可访问私有保护,只能访问公有成员。当我们用sizeof()对外部类计算大小时是不计算内部类的。

类的总结

类是一个抽象的概念,在计算机的世界没有复杂的定义只有二进制,但是人类是可以进行抽象的联想的。所以就有了类,类就如同是人与计算机的一种交流规则,人的抽象思想定义一个类,通过细节的实现完成类被计算机去理解(这里还需要经过编译器的翻译)。这样我们就可以复用这个类而让人与计算机的交流变得更为高效。

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

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

相关文章

GeoStudio2024:地质工程的瑰宝下载安装介绍

引言 青山隐隐&#xff0c;流水潺潺&#xff0c;吾心所向&#xff0c;乃地质之奥秘。GeoStudio2024&#xff0c;如同一卷古籍&#xff0c;蕴藏无尽智慧&#xff0c;助吾等探寻地质之真谛。今以李白之笔&#xff0c;述其妙用&#xff0c;愿与君共赏。 初识GeoStudio2024 初见…

优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策

Web层缓存对于提高应用性能至关重要&#xff0c;它通过减少重复的数据处理和数据库查询来加快响应时间。例如&#xff0c;如果一个用户请求的数据已经缓存&#xff0c;服务器可以直接从缓存中返回结果&#xff0c;避免了每次请求都进行复杂的计算或数据库查询。这不仅提高了应用…

【iOS】iOS中简单的网络请求

目录 前言认识API和RULAPIURL两者的联系 简单的网络请求1. 创建URL对象2. 创建URLRequest对象3. 设置请求头&#xff08;如果需要&#xff09;4. 发送请求异步请求同步请求 5. 处理请求结果6.启动数据任务完整代码示例及运行结果&#xff1a; 关于同步请求和异步请求同步请求异…

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…

MySQL(五)——表设计(约束、范式、表关系)

文章目录 表设计约束非空约束&#xff08;NOT NULL&#xff09;唯一约束&#xff08;UNIQUE&#xff09;主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;默认值约束&#xff08;DEFAULT&#xff09;检查约束&#xff08;CHECK&#x…

考研数学最迟什么时候要结束强化?10月才做真题是不是晚了?

已经快9月了&#xff0c;很多同学的考研数学的强化也接近尾声&#xff0c;这个时候要注意两个事情&#xff1a; 1、如果你还有很多没学完&#xff0c;不要强行收尾&#xff0c;稳扎稳打的把强化给结束了。 2、强化结束之前&#xff0c;要清理完所有在强化阶段产生的错题&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

应用层与传输层

1.应用层 很多时候这一层的协议是程序员自定义的应用层协议&#xff08;相当于一种约定&#xff0c;约定数据如何进行传输&#xff09;。 eg&#xff1a; 实现登录的场景&#xff1a; 此时前端就需要与后端约定请求&#xff08;假设约定使用ajax请求&#xff09;中的一些参…

接口自动化测试面试题目详解

1、get和post区别是什么&#xff1f; 答&#xff1a;POST和GET都是向服务器提交数据&#xff0c;并且都会从服务器获取数据。 区别&#xff1a; &#xff08;1&#xff09;传送方式&#xff1a;get通过地址栏传输&#xff0c;post通过报文传输 &#xff08;2&#xff09;传…

c语言 自定义类型--枚举 、联合 #枚举类型的定义 #枚举的优点 #枚举的使用 #联合类型的定义 #联合的特点 #联合大小的计算

文章目录 前言 一、枚举 (一)、枚举类型的定义 (二)、枚举的优点 (三)、枚举的使用 二、联合 (一)、联合类型的定义 (二)、联合的特点 (三)、联合大小的计算 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 枚举、联合跟结构体很像&#xff0c;想要细致地了…

基于SpringBoot+Vue+uniapp的“村游网”系统的微信小程序开发的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 &#x1f31e;博主介绍 &#xff1a;✌全网粉丝15W,CSDN特邀作者、21…

基于状态机实现WIFI模组物联网

1.0 状态机框架原理 如果成功的话就连接热点&#xff0c;如果失败就返回AT通信检查&#xff0c;如果AT通信检查还是失败就放回硬件复位这个状态&#xff0c;如果热点链接成功&#xff0c;就连接MQTT指令&#xff0c;如果失败就返回AT通信检查&#xff0c;如果成功就连接云平台通…

跟着B站前端面试总结回顾前端基础知识(一)

组件划分标准 组件划分_哔哩哔哩_bilibili 在前端Vue开发中&#xff0c;组件的划分是构建高效、可维护应用的关键步骤。Vue组件的划分标准通常基于多个方面的考虑&#xff0c;包括但不限于功能独立性、复用性、可维护性和可扩展性。以下是一些Vue组件划分的标准&#xff1a; …

破解历史合同“旧题” 答好集体经济“新篇”

——汕头市龙湖区&#xff1a;全面推进乡村振兴战略 实现农村集体经济新飞跃 农村集体资产资源是乡村赖以生存的家底&#xff0c;也是村集体经济发展壮大、更好推动乡村振兴战略加力提速的承载。自2023年10月开始&#xff0c;在汕头市龙湖区的广袤乡村上&#xff0c;一场关于村…

图解搜索算法(BFS、DFS、Dijstra算法、KSP算法、A*算法)

文章目录 深度优先搜索算法广度优先搜索算法Dijkstra算法KSP算法A*算法 由于在工作中用到了BFS算法、DFS算法、Dijkstra算法、KSP算法&#xff0c;因此将上述算法的工作原理记录一下&#xff0c;同时用图解的方式解释相应的算法。A*算法由于本文在工作中&#xff0c;还没用过&a…

深度学习语义分割篇——LR-ASPP原理详解+源码实战

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

简单使用富有创造力的DALL·E 3 图像生成器——OpenAI Images Generations API

OpenAI Images Generations API 申请及使用 DALL-E 3 是 OpenAI 开发的两个版本的图像生成模型&#xff0c;它们能够根据文本描述生成高质量的图像。 本文档主要介绍 OpenAI Images Generations API 操作的使用流程&#xff0c;利用它我们可以轻松使用官方 OpenAI DALL-E 的图…

类和构造函数之间的继承

类之间构造函数的继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过这种方式&#xff0c;子类可以复用父类的代码&#xff0c;从而避免重复&#xff0c;提高代码的可维护性…

Swagger的增强knife4j

效果图 导入依赖 <!--不是导入swagger原因就是&#xff1a;knife4j对swagger增强--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version><…

考研数学| 张宇线代9讲换李永乐线代讲义,强化来得及吗?

张宇线代9讲&#xff1a; 张宇老师的线代九讲和张宇老师的线代课程搭配使用&#xff0c;相对于更适合线代底子足够强的同学。整体书的题目难度较大&#xff0c;所以开始刷了之后发现不适合自己可以选择换一本习题册&#xff0c;当然如果担心时间不够还是想尽力刷下去的话可以去…