【C++】类和对象(3)

news2024/11/24 6:16:48

文章目录

  • 一、初始化列表
  • 二、explicit关键字
  • 三、static成员
  • 四、友元
    • 4.1 友元函数
    • 4.2 友元类
  • 五、内部类
  • 六、匿名对象
  • 七、编译器的优化


一、初始化列表

首先我们先回顾一下构造函数,对象的初始化由构造函数来完成,我们可以在构造函数的函数体内对对象的成员变量进行赋值,但这就有一个问题,如下:
在这里插入图片描述

答案:显然不是,因为变量只能定义一次。
在这里插入图片描述

也就是说,构造函数的函数体内部并不是初始化的地方(定义的地方),而是赋值的地方。那这些成员变量定义的地方在哪里呢?在初始化列表中。


初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式

在这里插入图片描述
初始化列表有以下特性:

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。 意思是:即使你没有写初始化列表,每个成员变量还是会走一遍初始化列表,你写了初始化列表,每个成员变量你也只能写一次。
    在这里插入图片描述
  2. 类中包含以下成员,必须放在初始化列表位置进行初始化。引用成员变量,const成员变量,自定义类型成员(且该类没有合适的默认构造函数)
    在这里插入图片描述

c++11可以给成员变量缺省值,这里的缺省值实际上是提供给了初始化列表。在这里插入图片描述

  1. 初始化列表的初始化顺序与成员变量的声明顺序一致。因此一定要注意初始化列表是初始化顺序,最好代码的顺序与成员变量的声明顺序一致。
    在这里插入图片描述

因此尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。(当然这并不代表构造函数的函数体没有用了)
在这里插入图片描述


二、explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用

在这里插入图片描述

按语法来说是:(int)2 先进行构造产生一个 (A)的临时对象,然后再将(A)临时对象拷贝构造给a2
但是一般情况下:在同一个表达式里面,连续的构造,编译器都会优化为 直接使用2来构造,相当于a1的那种方式。
验证如下:
在这里插入图片描述

那有人就问了,有没有这种可能性:不存在隐式类型转换,编译器也没有进行优化,不管哪种情况都是直接用进行了拷贝构造。一样可以进行验证:
在这里插入图片描述

那这有什么用呢?
传参可以像这样传:
在这里插入图片描述


那如果我不允许这种转换发生呢,可以使用explicit关键字。
在这里插入图片描述
此时就不允许从 (int) 转换到 A了


三、static成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

在这里插入图片描述
static成员的特性:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区,故下面的A类大小为4

在这里插入图片描述

  1. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明,即静态成员变量不会走初始化列表
    在这里插入图片描述

  2. 类静态成员即可用 类名::静态成员或者对象.静态成员来访问
    在这里插入图片描述

  3. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员,因为没有this指针,所以可以像这样调用A::fun()
    在这里插入图片描述

  4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

  5. 非静态成员函数可以调用静态成员函数,静态成员函数不可以调用非静态成员函数
    在这里插入图片描述
    思考题:如何构造一个类,使其对象只能在栈、堆上创建?
    在这里插入图片描述
    操作如下:
    在这里插入图片描述


牛客网:计算1+2+3+……+n

class Sum {
public:
    Sum() {
        sum += i;
        i++;
    }
    static int GetSum() {
        return sum;
    }
private:
    static int sum;
    static int i;
};
int Sum::sum = 0;
int Sum::i = 1;
class Solution {
public:
    int Sum_Solution(int n) {
        Sum a[n];
        return Sum::GetSum();
    }
};

四、友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
友元分为:友元函数和友元类

4.1 友元函数

在这里插入图片描述
友元函数的特性:

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数

  2. 友元函数不能用const修饰:这里的const修饰指的是在后面加constvoid func() const {}

  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
    在这里插入图片描述

  4. 一个函数可以是多个类的友元函数

  5. 友元函数的调用与普通函数的调用原理相同

4.2 友元类

友元类的特性:

  1. 友元关系是单向的,不具有交换性。
    比如A类和B类,在A类中声明B类为其友元类,那么可以在B类中直接访问A类的私有成员变量,但想在A类中访问B类中私有的成员变量则不行。
  2. 友元关系不能传递
    如果B是A的友元,C是B的友元,则不能说明C时A的友元。
  3. 友元关系不能继承
    在这里插入图片描述

五、内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

内部类的特征:

  1. 内部类受访问限定符的限制
    在这里插入图片描述
  2. 内部类天生是外部类的友元类
    在这里插入图片描述

六、匿名对象

匿名对象就是没有名字的对象
匿名对象的特性:

  1. 它的生命周期就在当前行
    在这里插入图片描述
  2. 匿名对象具有常性
    在这里插入图片描述

小提一句:const引用会延长匿名对象的生命周期


七、编译器的优化

在第二节explicit关键字中提到,在连续的两次构造/拷贝构造,编译器会优化为一次构造/拷贝构造
在这里插入图片描述
像下面这样写成两行, 就不会优化。
在这里插入图片描述
因此尽量写成一行,从而让编译器能够实现优化。

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

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

相关文章

00后卷王,把我们这些老油条卷的辞职信都写好了........

现在的小年轻真的卷得过分了。 前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家…

一个简单的c程序

有些基础知识点如果不经常温故可能就会忘记&#xff0c;难道是因为我已经老了吗&#xff1f;人要是老了&#xff0c;脑子是真的不好用了啊。今天看一个很简单的c代码&#xff1a; #include <stdio.h> #include <stdlib.h>typedef int eint32; typedef unsigned in…

基于数据库实现乐观锁

基于数据库实现乐观锁 一 乐观锁与悲观锁介绍二 乐观锁实践案例2.1 库存超卖问题复现2.1.1 模拟秒杀下单分析2.1.2秒杀代码2.1.3单元测试结果 2.2 库存超卖问题分析2.3 乐观锁解决超卖问题2.3.1版本号方式 案例源码案例中sql脚本 一 乐观锁与悲观锁介绍 悲观锁&#xff1a; 悲…

Java的文件操作和IO

目录 一、认识文件 树型结构组织 和 目录 文件路径&#xff08;Path&#xff09; 其他知识 二、Java 中操作文件 File 概述 属性 构造方法 文件内容的读写 —— 数据流 InputStream 概述 FileInputStream 概述 构造方法 代码示例 利用 Scanner 进行字符读取 Out…

Puppeteer 部署 - Docker容器 - Idea一键部署

Puppeteer 代码注意 部署到服务器&#xff0c;报错 Running as root without --no-sandbox is not supported.解决方案&#xff1a; const browser await puppeteer.launch({args: [--no-sandbox],env: {DISPLAY: ":10.0"}});Dockerfile 编写Dockerfile根据自己…

前后端交互 | 传递参数的方式

目录 GET请求两种方式 第一种&#xff1a;&#xff1f;& 形式 第二种:不使用&#xff1f;或者引号进行 传递参数 POST请求 小结&#xff1a; get和post的使用情况 传参数重复 传参数&#xff1a;目前共有三种传递参数的方式 GET请求两种方式 第一种&#xff1a;&…

史上最全BI知识全解,万字长文带你读懂BI

在各种新趋势的影响下&#xff0c;数字化不仅在当下有着强大的实力以及巨大的潜力&#xff0c;更是成为了未来世界的标志&#xff0c;成为了社会各界对未来发展的共识。企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字…

cpp综合项目—机房预约系统

目录 1、机房预约系统需求 1.1、 身份简介 1.2、机房简介 1.3、申请简介 1.4、 系统具体需求 2、创建项目 3、创建主菜单 3.1 菜单实现 3.2、接口实现 4、退出功能实现 4.1、退出功能实现 4.2、测试退出 5、创建身份类 5.1、身份的基类 5.2、学生类 5.3、老师类…

windows重装后恢复谷歌浏览器数据(旧的用户数据仍存在user data)

背景及注意前提&#xff01;&#xff01;&#xff01; 首先基于我笔记本被公司电脑加域之后&#xff0c;原先家庭版还被升级成了专业版&#xff0c;但是旧的user用户数据还都存在。只是变成了两个用户&#xff0c;开机默认是加域后的用户。 如果你的C盘已经完全被重写了&…

shell计算天数差和月份差

计算月份差 monthdiff.sh function getMonthDiff() { date1${1//-/} date1_year${date1:0:4} date1_month${date1:4:2} date2${2//-/} date2_year${date2:0:4} date2_month${date2:4:2} diff$(((date1_year-date2_year)*12 (date1_month-date2_m…

目前国内有哪些开源的非 SaaS 团队协作平台、项目管理工具呢?

以下是一些常用的开源团队协作平台和项目管理工具&#xff1a; 1.Gitea Gitea 是一个轻量级的 Git 服务&#xff0c;它提供了一个基于 Web 的界面&#xff0c;以方便地管理 Git 存储库。Gitea 也是一个自托管的 Git 服务&#xff0c;可以轻松地在本地或云环境中部署。 2.GitL…

详细分析置换算法

对于操作系统而言&#xff0c;虚拟空间是非常大的&#xff0c;我们往往无法直接将如此大的空间装入内存&#xff0c;而即使我们采用多级页表与段页式存储即使&#xff0c;也仅仅只是节省了页表的大小&#xff0c;如此将如何多的物理页装进内存仍然是一个问题&#xff0c;为此科…

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文

【2023年4月美赛加赛】Z题&#xff1a;The future of Olympics 25页完整论文 1 题目 背景 国际奥委会(IOC)正面临着夏季奥运会和冬季奥运会申办数量的减少**[1]**。在过去&#xff0c;举办奥运会的竞争非常激烈&#xff0c;声望也很高。然而&#xff0c;最近&#xff0c;主办…

MySQL基础篇——MySQL数据库 表的操作,

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.表操作 1.表操作-查询创建 1&#xff09;查询当前数据库所有表 2). 查看…

在ubuntu20.x上修改mysql密码

1&#xff0c;在安装mysql后测试mysql是否安装成功可链接数据测试输入一下命令命令都在终端中输入 mysql -u root -p 提示输入密码错误 输入命令后需要输入数据库密码&#xff0c;如忘记密码可进行数据库密码的修改 2&#xff0c;sudo cat /etc/mysql/debian.cnf 输入命令后…

MySQL2-多表查询、子查询、union、limit机制

一、多表查询 在实际开发中&#xff0c;大部分情况下都不是从单表中查询数据&#xff0c;一般都是多张表联合查询取出最终的结果。一般一个业务都会对应多张表。 1.表的连接方式的分类 内连接&#xff1a;等值连接、非等值连接、自连接 外连接&#xff1a;左外连接&#xff08;…

HTML+CSS实训——Day02——写一个登陆界面

前言 今天要继续完成我们的音乐软件了&#xff0c;昨天写完了封面&#xff0c;今天该完成开屏广告和登陆界面了。 登陆界面代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

00后太卷了,老油条感叹真干不过...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

Whatsns内容付费seo优化带采集和熊掌号运营问答系统

正文&#xff1a; 付费课程增加付费课程试听功能基础版和高级企业版&#xff0c;Plus版增加微信消息模板回答通知&#xff0c;采纳答案通知改进兼容因导入Discuz用户密码规则不兼容导致登录失败问题基础版和高级企业版&#xff0c;Plus版增加改进微信文本回复&#xff0c;支持…

【搭建服务器】Win10 IIS搭建webdav服务以及公网访问教程 - 挂载webdav

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表 4. 公网远程访问4.1 浏览器访问测试4.2 映射本地盘符访问4.3 安装Raidrive客户端 总结&#xff1a; 自己用W…