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

文章目录

  • 一、初始化列表
  • 二、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关键字中提到,在连续的两次构造/拷贝构造,编译器会优化为一次构造/拷贝构造
在这里插入图片描述
像下面这样写成两行, 就不会优化。
在这里插入图片描述
因此尽量写成一行,从而让编译器能够实现优化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net就业满意度问调查系统

本系统主要有会员(调查者)和管理员,他们具体的功能如下: 会员功能:注册,登录,修改个人信息,调查,查看调查结果及影响,留言,首先是会员注册,注册后…

广域通信网 - HDLC 高级数据链路控制协议

文章目录 1 概述2 HDLC2.1 帧类型2.2 帧结构 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-JEuFH1qP4tY5jI5p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEuFH1qP4tY5jI5p .error-icon{fill:#552222;}#mermaid-…

python如何连接mysql数据库

python链接mysql数据库要用到pymysql模块中的connect ,connect函数是pymysql模块中 用于连接MySQL数据库的一个函数。 所以连接mysql之前需要先导入pymysql模块。 第一步,mysql模块下载 方法1(使用pip命令安装): 因…

MySQL数据库基础4-内置函数

文章目录 日期函数字符串函数数学函数其他函数 日期函数 函数名称描述current date()当前日期current time()当前时间current timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date add(date, interval d_value type)在date中添加日期或时间,interv…

调用百度API自动生成春联

目录 1、作者介绍2、百度智能春联介绍录2.1 功能介绍2.2 技术特色 3、智能春联API接口介绍3.1 请求参数3.2 返回参数 4. 操作流程5. 代码实现 1、作者介绍 范宇帅,男,西安工程大学电子信息学院,2022级研究生 研究方向:多机器人协…

Windows安装Ubuntu双系统

Windows安装Ubuntu双系统 1.下载Ubuntu 16.04,地址https://releases.ubuntu.com/16.04/ 2.下载Rufus,地址https://rufus.ie/zh/ 3.准备U盘,烧录系统 4.磁盘分区 5.重启,按住shift键 本人电脑是联想小新 Windows11系统&#xff0…

Elasticsearch环境搭建(Windows)

一、介绍 布式、RESTful 风格的搜索和分析。 Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管…

Spring Cloud第二季--服务网关Gateway

文章目录 一、Gateway和Zuul的区别二、Gateway的核心概念三、小试牛刀3.1、代码测试3.2、关于Predicate3.3、关于Filter 一、Gateway和Zuul的区别 Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project …

【文献研究】轴辐式航线网络设计—Liner hub-and-spoke shipping network design

学习文献:轴辐式航线网络设计—Liner hub-and-spoke shipping network design 3. 模型建立 轴辐式航线网络设计 三级轴辐式网络:喂给港-二级枢纽港-一级枢纽港 主要考虑的限制条件:多种类型的集装箱船舶、转运时间、多种类型的集装箱 转运操…

Windows 11部署WSL(Windows Subsystem for Linux——适用于Windows的Linux子系统)

文章目录 前言一、Windows 11部署WSL(Windows Subsystem for Linux)1.打开控制面板→程序→启动或关闭 Windows 功能2.勾选 “适用于 Linux 的 Windows 子系统” 和 “虚拟机平台”3.立即重新启动电脑4.按win键或者点击左下角的windows图标打开微软的应用…

使用C++快速上手ProtoBuf (一)

文章目录 课程目标一、初始ProtoBuf1. 序列化概念2.ProtoBuf是什么3.ProtoBuf的使⽤特点 二、安装ProtoBuf三、教学思路四、快速上⼿步骤1:创建.proto文件步骤2:编译contacts.proto⽂件,⽣成C⽂件步骤3:序列化与反序列化的使⽤⼩结…

人员与叉车防撞预警方案

叉车是仓库重吨位运输设备,在工厂、港口、码头、物流企业等有着广泛的使用。然而,叉车事故频繁发生已经引起人们的广泛关注。多数叉车因为前方货物遮挡的视线盲区多,极容易发生事故,例如撞伤人或货架导致货物倒塌伤人,…

Promise面试题

Promise面试题,带你搞懂同步异步执行顺序 前置知识面试题面试题一面试题二面试题三面试题四 分析面试题一分析面试题二分析面试题三分析面试题四分析 前置知识 Promise中的then方法 then:指定用于得到成功value的成功回调和用于得到失败reason的失败回调…

C语言深度解析--数组

目录 一维数组的创建与初始化 一维数组的创建: 一维数组的初始化: 一维数组的使用: 一维数组在内存中的存储: 二维数组的创建与初始化 二维数组的创建: 二维数组的初始化: 二维数组的使用&#xf…

字节跳动开源其云原生数据仓库 ByConity

动手点关注 干货不迷路 ‍ ‍项目简介 ByConity 是字节跳动开源的云原生数据仓库,它采用计算-存储分离的架构,支持多个关键功能特性,如计算存储分离、弹性扩缩容、租户资源隔离和数据读写的强一致性等。通过利用主流的 OLAP 引擎优化&#xf…

Hive---拉链表设计与实现

1 数据同步问题 Hive在实际工作中主要用于构建离线数据仓库,定期的从各种数据源中同步采集数据到Hive中,经过分层转换提供数据应用。比如每天需要从MySQL中同步最新的订单信息、用户信息、店铺信息等到数据仓库中,进行订单分析、用户分析。 …

使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

这是一个大胆的决定 这里是导航 技术栈开发工具一、创建gradle父子项目(deity)1.0 简单流程示意1.1、IDEA中主要图示1.1.1 项目结构图1.1.2 IDEA中 Gradle配置 1.2、deity父项目build.gradle文件1.3、deity父项目settings.gradle文件1.4、子项目build.g…

django ORM框架 第四章 聚合函数

上一章:django ORM框架 第三章 关联表的数据创建与查询_做测试的喵酱的博客-CSDN博客 一、聚合函数类型: from django.db.models import Q, Count, Avg, Max, Min 班级表: 学生信息表: 1.1 Count 模版: QuerySet.…

3 手工推导Neural Networ

线性模型假设的问题 如上图,对非线性类边界的数据进行分类 一个解决方案是将数据映射到更高维的空间,就变成线性可分的了。 ϕ \phi ϕ 是一个映射函数,将x从一个低维空间映射到高维空间。 ϕ \phi ϕ 可不可以是一个线性函数? …

音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境

安装vs2019qt,并且在windows环境上安装ffmpeg,尝试使用qtcdb进行调试,尝试使用vs2019加载qt的程序。 安装VS20195.12.2qt环境,并进行测试。 1:安装Visual Studio 2019, a.从官网下载,或者vs2019社区版本下载地址 ht…