类和对象【下】

本节博客主要围绕构造函数、static成员、友元、内部类、匿名对象等待关于“类和对象”这些细节性知识进行收尾,有需要借鉴即可

类和对象_下目录

  • 1.再谈构造函数
    • 1.1初始化列表
    • 1.2意义
  • 2.static成员
    • 2.1概念
    • 2.2特性
    • 2.3习题
  • 3.友元
    • 3.1友元函数概念
    • 3.2友元函数的特性
  • 4.内部类
    • 4.1概念
    • 4.2特性
  • 5.匿名对象
    • 5.1概念
  • 6.拷贝构造的编译器优化

1.再谈构造函数

在前一节我们初步介绍了一下构造函数,说构造函数是对类对象的“初始化”函数。但是实际上构造函数有两部分,分为初始化列表部分和函数体内部分。

那什么是初始化列表部分和函数体内部分呢?下面来做介绍:

1.1初始化列表

概念:CPP为了解决所有成员变量初始化而对构造函数做的补充

初始化列表的语法参考下图:
在这里插入图片描述
CPP为什么要提供构造函数的初始化列表部分?
这当然是存在意义的,总的来说,是为了更好的完成初始化任务。

1.2意义

  • 1.使每个成员变量只能初始化一次。
    按照道理来说,初始化只能进行一次,但是在构造函数体内却可以多次“初始化”,这样是与“初始化”这个词的含义有些违背的,因而在初始化列表中每个变量只能初始化一次。

  • 2.引用、const变量、没有默认构造函数的自定义类型成员变量初始化
    这三者必须用初始化列表进行初始化,因为构造函数体内不能进行初始化。
    在这里插入图片描述
    在这里插入图片描述

  • 3.成员变量在类中的声明顺序就是初始化顺序,因此建议在初始化列表初始化顺序与声明一致。
    在这里插入图片描述

  • 4.初始化列表中可以支持一句简单的语法进行初始化
    在这里插入图片描述

  • 5.单参数构造函数支持类型转换
    在这里插入图片描述
    在这里插入图片描述
    上面我们对构造函数进行了补充说明,下面我们来说一下static成员

2.static成员

2.1概念

static + 变量,静态成员,存储于静态区中。

定义在类中的静态成员在类内,但是其存储区域在静态区。不会随着类对象的销毁而销毁。
用法1:可以用来统计类构造函数和析构函数的调用次数。
在这里插入图片描述

思考:这里为什么不用全局变量而用static变量?
因为全局变量并不安全,对于私有的类静态成员会更加安全一些。

2.2特性

  • 1.存储区域:静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  • 2.静态成员变量必须在类外定义,定义时不添加static关键字,类中的只是声明而已

思考:静态成员变量声明在类中,定义类对象时候为什么没有对应的静态成员还需要特别进行定义?
答:因为static存储的区域并不在类对象中,静态成员变量是存放在静态区的。

  • 3.访问:类静态成员既可以用 类名::静态成员 或者类对象+点+静态成员的方式来进行访问
  • 4.this指针:静态成员函数并没有隐藏的this指针,不能访问任何非静态成员
  • 5.安全性:静态成员上是声明在类中的,因而受访问限定符的限制和类域的限制

思考:非静态成员函数可以调用类的静态成员函数吗?
答:可以,因为类中的静态成员函数是在静态区的,类似于全局函数。

2.3习题

为了更好的理解static的作用,我拿出一道题来让大家更好的体会static静态成员的作用:
题目链接:LINK
在这里插入图片描述
思路:利用静态变量统计构造函数的调用次数来计算,可以用创建数组来控制创建多少个类对象来代替循环。

#include <climits>
#include <cmath>

//类声明
class SUM {
private:
    static int _i;
    static int _sum;
public:
    static int GetSUM()
    {
        return _sum;
    }

    SUM()
    {
        _sum += _i;
        _i++;
    }
};

//静态变量定义
int SUM::_i = 1;
int SUM::_sum = 0;


class Solution {
public:
    int _i = 1;
    int _sum = 0;
    int Sum_Solution(int n)
    {
        SUM a[n];
        return SUM::GetSUM();
    }
};

3.友元

友元分为友元函数和友元类两种用法,具体如下:

3.1友元函数概念

为一些类外的函数访问类内私有成员变量“走后门”

这里拿自己写的流插入符号重载函数来举例:
在这里插入图片描述

3.2友元函数的特性

  • 1.友元函数可以访问类的私有和保护成员,但不是类的成员函数
  • 2.友元函数不能用const进行修饰
    为什么?因为const修饰函数是修饰函数中的隐藏this指针,但是友元函数压根就不属于类中的,是没有this指针的。
    参见:LINK
  • 3.友元函数可以在类定义的任何地方进行声明,不受类访问限定符的限制
  • 4.一个函数可以是多个类的友元函数
  • 5.友元函数的调用和普通函数的调用原理相同

4.内部类

4.1概念

如果一个类定义再另一个类的内部,这个内部类就叫做内部类

在这里插入图片描述

4.2特性

  • 1.内部类受到所属类的类域限制和访问限定符号的限制
  • 2.内部类天生是外部类的友元

5.匿名对象

5.1概念

没有名字的类对象
在这里插入图片描述

int main()
{
A aa1;
//1.匿名类对象与函数声明:
//不能这么定义对象,因为编译器无法识别下面是一个函数声明还是对象定义
//A aa1();
//2.匿名类对象的生命周期:
//但是我们可以这样定义匿名类对象
//不过注意,匿名类对象的生命周期只有这一行
A();

//3.匿名类对象的应用:
//匿名对象在这样的场景下就很好用:比如只想看一下A中的默认Date值。
A().printDate();
return 0;
}

6.拷贝构造的编译器优化

在实际运行代码时候,编译器为了优化代码,提高效率,可能会省略某些不必要动作而不影响实际的效果。

下面是一些举例:
在这里插入图片描述

好了,类和对象就介绍到这里了~


EOF

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

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

相关文章

Blender笔记之基本操作

code review! —— 2024-04-27 杭州 Blender笔记…

pytest教程-27-分布式执行用例插件-pytest-xdist

上一小节我们学习了pytest随机执行用例插件-pytest-random-order&#xff0c;本小节我们讲解一下pytest分布式执行用例插件pytest-xdist。 前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟。如果一个测试人员执行需要10…

选择汽车制造业数据外发解决方案,核心在这三点

汽车制造业是我国国民经济发展的支柱产业之一&#xff0c;汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。汽车制造业产业链长&#xff0c;关联度高&#xff0c;汽车制造上游行业主要为钢铁、化工等行业&#xff0c;下游主要为个人消 费、基建、客运和军事…

Linux 常用命令分类

一、帮助命令 命令功能语法man求助man [命令]info求助info [命令]help求助[命令] --help 1.1、man 命令 按键功能空格向下翻页pagedown也就是fn ↓ \downarrow ↓向下翻页pageup向上翻页/string向下查找string这个字符串?string向上查找string这个字符串n,Nn表示继续, N表示…

PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化

为什么要对图像进行拉普拉斯锐化 对图像进行拉普拉斯锐化的目的是增强图像的边缘和细节&#xff0c;使图像看起来更加清晰和锐利。这种技术常用于图像处理中&#xff0c;具体原因如下&#xff1a; 增强图像的边缘信息&#xff1a;拉普拉斯锐化可以突出图像中的边缘特征&#x…

Spring AOP(1)

AOP概述 AOP是Spring框架的第二大核心(第一大核心是IoC). 什么是AOP? 即Aspect Oriented Programming(面向切面编程) 什么是面向切面编程呢? 切面就是指某一类特定的问题, 所以AOP也可以叫做面向特定方法编程. 什么是面向特定方法编程呢?比如上一篇中讲到的拦截器, 就是…

windows无法启动Remote Desktop Services服务(位于本地计算机上) 错误2:系统找不到指定文件

在使用远程计算机时出现的错误&#xff0c;计算机在后台能正常打开&#xff0c;而无法使用远程连接&#xff0c;初步判定为远程服务问题&#xff0c;检查步骤如下&#xff1a; 一、检查计算机Remote Desktop Services服务 该服务是开启计算机远程时必要的服务&#xff0c;若该…

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的&#xff0c;如果您不小心从系统中删除了文件或数据&am…

Vue3+Vite开发的项目进行加密打包

本文主要介绍Vue3+Vite开发的项目如何进行加密打包。 目录 一、vite简介二、混淆工具三、使用方法1. 安装插件:2. 配置插件:3. 运行构建:4. 自定义混淆选项:5. 排除文件:下面是Vue 3+Vite开发的项目进行加密打包的方法。 一、vite简介 Vite 是一个由 Evan You 创造的现代…

【Linux】进程信号 -- 详解

⚪前言 注意&#xff1a;进程间通信中的信号量跟下面要讲的信号没有任何关系。 一、从不同角度理解信号 1、生活角度的信号 你在网上买了很多件商品&#xff0c;在等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临时&#xff0c;你该怎么处理快递&a…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦&#xff0c;使得二者可以独立变化。 2、实现思路 使用桥接模式&#xff0c;一定要找到这个类中两个变化的维度&#xff1a;如支…

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台浏览管理界面图&#xff0c;通过内容列表可以获取网…

Git--多人协作

目录 一、多人协作一二、多人协作二三、 远程分⽀删除后&#xff0c;本地git branch -a依然能看到的解决办法 一、多人协作一 ⽬前&#xff0c;我们所完成的⼯作如下&#xff1a; 1.基本完成Git的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分⽀理解&#xff0c;…

适用于芯片行业的开发及管理工具:版本控制、持续集成、代码分析及项目管理工具介绍

3月28日-29日&#xff0c;2024国际集成电路展览会暨研讨会&#xff08;IIC Shanghai&#xff09;在上海成功举行。此次盛会汇聚了集成电路产业的众多领军企业&#xff0c;共同探寻和把握集成电路产业的发展脉络。 龙智携芯片研发及管理解决方案亮相展会&#xff0c;展示如何通…

遥感雷达波段的原理及应用

雷达波段是不同波长的组。每一种都有其独特的穿透地球表面的能力。它们还可以揭示环境的不同方面。 雷达频段在电磁频谱内具有特定的频率范围。这些波段由 L-、S-、C- 和 X-波段等字母表示。稍后会详细介绍这一点。 什么是合成孔径雷达&#xff1f; 合成孔径雷达 (SAR) 是一…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

PotatoPie 4.0 实验教程(30) —— FPGA实现摄像头图像中值滤波

中值滤波是什么&#xff1f; 图像的中值滤波是一种非线性图像滤波方法&#xff0c;它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同&#xff0c;中值滤波不会受到极端值的影响&#xff0c;因此在处…

FebHost:摩洛哥.ma域名注册介绍,规则有哪些?

摩洛哥国家域名介绍 摩洛哥是位于非洲西北部的一个国家&#xff0c;北部和西部面向地中海和大西洋&#xff0c;东部和南部则与阿尔及利亚、西撒哈拉和毛里塔尼亚接壤。摩洛哥的首都是拉巴特&#xff0c;但最大城市是卡萨布兰卡。摩洛哥的官方语言是阿拉伯语和柏柏尔语&#xf…

BTCOIN发布WEB3.0论坛:生态与金融的双重叙事热点驱动自由创新意识

在数字时代&#xff0c;信息的自由流动和透明度是推动经济发展和社会进步的关键。尤其在加密货币和区块链领域&#xff0c;这一点尤为重要。BTCOIN的最新创举——一个基于WEB3.0理念的信息论坛&#xff0c;不仅标志着信息传递自由化的新篇章&#xff0c;也为数字货币市场的信息…

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter&#xff08;异常处理&#xff09;&#xff0c;使用中间件异常处理&#xff0c;使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度&#xff0c;以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…