当前位置: 首页 > news >正文

匿名对象的特性和使用场景你知道吗?

目录

一、匿名对象的概念

二、单参数和多参数构造场景的匿名对象

①只有一个参数的构造函数

②多个参数的构造函数

三、使用匿名对象作为函数的参数的缺省值

四、只为调用类中的一个函数时

五、匿名对象的特性

1、匿名对象的生命周期只有一行

2、匿名对象具有常性

3、当匿名对象被引用时,匿名对象的生命周期会变长


一、匿名对象的概念

匿名对象:

没有对象名,也不需要对象名,直接使用类名创建对象,如:

#include<iostream>
using namespace std;
class Date
{
public:Date(int a = 1, int b = 7){_a = a;_b = b;}~Date(){cout << "析构~Date()" << endl;}
private:int _a;int _b;
};
int main()
{Date();//匿名对象return 0;
}

二、单参数和多参数构造场景的匿名对象

对于单参数的构造函数,C++支持使用等号(=)来初始化刚创建的对象

①只有一个参数的构造函数

#include<iostream>
using namespace std;
class Date
{
public:Date(int year ){_year = year;}~Date(){cout << "析构~Date()" << endl;}
private:int _year;
};
int main()
{   //编译时,实际变为了 Date d = Date(2023)Date d = 2023;//这一步发生了隐式类型转换return 0;
}

使用等号(=)创建匿名对象时,会发生隐式类型转换,先通过构造函数生成一个匿名对象(临时对象),然后通过拷贝构造将该对象的值赋给刚创建的对象d

但是编译器认为这样太慢,所以直接就对该行进行了优化,从而只调用了构造函数

②多个参数的构造函数

这时可以使用缺省参数也能实现使用等号(=)来初始化刚创建的对象

#include<iostream>
using namespace std;
class Date
{
public:Date(int year,int month=5,int day=10 ){_year = year;_month = month;_day = day;}~Date(){cout << "析构~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{   //编译时,实际变为了 Date d = Date(2023)Date d = 2023;//这一步发生了隐式类型转换return 0;
}

通过调试发现,多参数也可以使用等号(=)初始化刚创建的对象

三、使用匿名对象作为函数的参数的缺省值

该使用场景在函数模板是比较常见的,当我们不确定参数的类型时可以使用匿名对象作为缺省值来给该参数指定一个默认的值,如:

vector(size_t n, const T& val = T())//vector构造函数{}
//T()表示匿名对象

在STL中就用到了匿名对象来定义vector的构造函数 

四、只为调用类中的一个函数时

当我们只想调用类中的一个函数时,发现如果没有类的实例化就无法调用,这时就必须创建一个类对象才能调用,这样是不是就很糟糕呢,因为实例化一个对象就会申请空间,占用了多余的内存空间,这时我们就可以使用匿名对象来调用,如:

class Solution {
public:
int Sum_Solution(int n) {
//...
return n;
}
};int main()
{// 匿名对象在这样场景下就很好用Solution().Sum_Solution(10);return 0;
}

这时使用匿名对象就不会占用多余的空间,因为匿名对象的声明周期只有一行,改行结束就会销毁

五、匿名对象的特性

1、匿名对象的生命周期只有一行

#include<iostream>
using namespace std;
class Date
{
public:Date(int year,int month=5,int day=10 ){_year = year;_month = month;_day = day;}~Date(){cout << _year << '-' << _month << '-' << _day << endl;cout << "析构~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{  Date(2023);//匿名对象Date d(2023, 5, 9);return 0;
}

通过结果我们可以发现,匿名对象的生命周期只有一行,因为对象的销毁顺序是 先创建的后销毁,后创建的先销毁。显然这里先销毁的匿名对象,而匿名对象又是先创建的,所以可以说明匿名对象的生命周期只有这一行

2、匿名对象具有常性

当我们这样引用时,可以发现是报错的

Date& d = Date(2023);//属于权限被放大的错误

当我们加上const修饰对象d时:

const Date& d = Date(2023);

 原因:匿名对象作为一个临时变量具有常性,当我们引用时不加const修饰就会发生权限被放大的问题,所以发生报错,权限可以被缩小和平移但不能被放大

3、当匿名对象被引用时,匿名对象的生命周期会变长

#include<iostream>
using namespace std;
class Date
{
public:Date(int year,int month=5,int day=10 ){_year = year;_month = month;_day = day;}~Date(){cout << _year << '-' << _month << '-' << _day << endl;cout << "析构~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{  const Date& d = Date(2023);//引用匿名对象Date d2(2023, 5, 9);return 0;
}

结果:

 通过结果可以发现,先销毁的是后创建的对象d2后销毁的是先创建的对象d(匿名对象的引用)

看到这大家一定会有疑惑,匿名对象的生命周期不是只有一行吗,为什么能被引用,且在后面销毁呢?

原因:匿名对象和引用它的对象的生命周期绑定在了一起,这时匿名对象的生命周期就变长了,引用它的对象的生命周期是多长,该匿名对象此时的生命周期就为多长。就像一个变量引用临时变量一样,临时变量的生命周期也变长了。

#include<iostream>
using namespace std;
class Date
{
public:Date(int year,int month=5,int day=10 ){_year = year;_month = month;_day = day;}~Date(){cout << _year << '-' << _month << '-' << _day << endl;cout << "析构~Date()" << endl;}
private:int _year;int _month;int _day;
};
const Date& d3 = Date(2023,5,8);//全局对象引用
int main()
{  static const Date& d = Date(2023);//局部对象引用Date d2(2023, 5, 9);return 0;
}

结果:

 可以发现,匿名对象的生命周期确实和引用该匿名对象的对象的生命周期绑定了

匿名对象的知识就分享到这了,如有错误的地方还请不吝指出,谢谢了,886!!!

相关文章:

匿名对象的特性和使用场景你知道吗?

目录 一、匿名对象的概念 二、单参数和多参数构造场景的匿名对象 ①只有一个参数的构造函数 ②多个参数的构造函数 三、使用匿名对象作为函数的参数的缺省值 四、只为调用类中的一个函数时 五、匿名对象的特性 1、匿名对象的生命周期只有一行 2、匿名对象具有常性 3、当匿…...

企业应该如何做到数字化转型成功?

01 成长型企业数字化转型的意义 成长型企业想要实现数字化转型&#xff0c;那么我们需要先弄明白&#xff0c;对于成长型企业而言&#xff0c;数字化转型到底具有什么意义&#xff1f;希望实现哪些目标&#xff1f; 可以归结为以下四点&#xff1a; 提升企业的生产力和效率&…...

PBDB Data Service:Bibliographic references for fossil collections(采集记录参考书目)

Bibliographic references for fossil collections&#xff08;采集记录参考书目&#xff09; 描述用法参数以下参数可用于检索与通过各种条件选择的集合关联的引用您可以使用以下参数根据书目参考文献的属性筛选结果集以下参数也可用于筛选选择以下参数可用于根据所选匹配项的…...

浅析图形验证码安全

0x01 前言 验证码的定义&#xff1a; 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;全自动区分计算机和人类的图灵测试&#xff09;的缩写&#xff0c;是一种区分用户是计算机还是人的…...

论文笔记:基于手机位置信息的地图匹配算法

2015计算机应用 整体思路和论文笔记&#xff1a;Hidden Markov Map MatchingThrough Noise and Sparseness_UQI-LIUWJ的博客-CSDN博客 很像&#xff0c;也是应用HMM进行地图匹配 HMMM本文 状态转移矩阵 观测概率矩阵 正态分布均值都是0&#xff0c;唯一不同的是S…...

因果推断系列16-面板数据与固定效应

因果推断系列16-面板数据与固定效应 1.平行趋势2.未观测变量的控制3.固定效应4.固定效应可视化5.时间效应小结加载第三方包 import warnings warnings.filterwarnings(ignore)import pandas as pd import numpy as np from matplotlib import style from matplotlib import...

第三十三章 弹性池塘2(弹城少年歌词)

熟悉的K26&#xff0c;熟悉的漉菽香味&#xff0c;熟悉的絮絮叨叨。 为什么坎迪总有那么多话想说&#xff0c;就算恢复正常&#xff0c;自己应该也找不出如滔滔江水连绵不断的语词洪流吧。 不&#xff0c;不是词汇量的问题。 当你习惯于将金玉良言与废屁空套话区分开来时&#…...

PMP之预测部分

引论 什么是项目 项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目管理是把事办成的方法论&#xff0c;万物皆可项目。 项目的基本要素 项目&#xff08;独特性、临时性&#xff09;、驱动变更、启动背景、创造商业价值。 组织级项目管理&#xff08;OPM&am…...

Node.js 异步流控制

目录 1、简介 2、状态管理 3、控制流 3.1、串联 3.2、完全并行 3.3、有限并行 1、简介 在其核心&#xff0c;JavaScript被设计为在“主”线程上是非阻塞的&#xff0c;这是呈现视图的位置。你可以想象这在浏览器中的重要性。例如&#xff0c;当主线程被阻塞时&#xff0…...

掌握这些思维技巧,解救996的打工人!

你身边有没有这样的人&#xff1a;面对堆积如山的工作、随时弹出的任务&#xff0c;接二连三的群也能游刃有余地处理。回看自己&#xff0c;旧的任务还在做&#xff0c;新的任务已经从天而降&#xff0c;日程表上满是任务却无从下手…… 明明忙个不停却成果甚微&#xff0c;这…...

【嵌入式Linux】MBR分区表 和 GPT分区表

文章目录 GUID以及分区表MBR分区方案GPT 分区方案GPT分区表结构 GPT分区表LBALBA0&#xff08;MBR兼容部分&#xff09;LBA1LBA 2-33python生成GPT分区表gpt分区表实例 gpt分区表查看查看百问网T113-s3固件查看友善之臂nanopi-m1-plus官方固件查看荣品RV1126固件查看f1c200s固件…...

【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读

【华为OD机试真题 2022&2023】真题目录 @点这里@ 【华为OD机试真题】信号发射和接收 &试读& @点这里@ 【华为OD机试真题】租车骑绿道 &试读& @点这里@ MVP争夺战 知识点DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在星球争霸篮球赛对…...

实战打靶集锦-019-BTRSys2.1

提示&#xff1a;本文记录了博主的一次普通的打靶经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 FTP服务探查4.2 Apache服务探查4.2.1 wpscan扫描4.2.2 Metasploit神器4.2.3 手工探查页面4.2.3.1 Appearance Editor4.2.3.2 Plugins Editor 5. 提权5.1 系统信息枚…...

2023中国(苏州)国际电源工业展览会暨高端论坛

时间&#xff1a;2023年11月9&#xff5e;11日 地点&#xff1a;苏州国际博览中心 30000㎡展出面积 500参展商 50000名专业观众 中国电源行业风向标----相约苏州&#xff0c;共襄盛举&#xff01; ◆展会背景Exhibition background&#xff1a; …...

基于SpringBoot+Vue的校园疫情防控系统(附源码和数据库)

文章目录 第一章2.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统功能模块5.2后台功能模块5.2.1管理员功能 源码咨询 第一章 springboot校园疫情防控系统演示录像2022 一个好的系统能将校园疫情防控的管理…...

Docker启动安装nacos

当需要在本地或云环境中部署和管理微服务时&#xff0c;Nacos是一个非常流行的选择。Nacos是一个用于动态服务发现、配置管理和服务管理的开源平台。在本文中&#xff0c;我们将详细介绍如何使用Docker来启动和安装Nacos。 步骤1&#xff1a;安装Docker 首先&#xff0c;确保…...

FastDFS总结

目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件&#xff…...

【职场新人备忘录】新人职场生存指南:快速适应、持续成长和个人提升

新人职场生存指南&#xff1a;快速适应、持续成长和个人提升 引言 职场对于新人来说充满了新的挑战和机遇。作为一名新人&#xff0c;如何在职场中快速适应、获得成长和提升自己是至关重要的技能。本备忘录旨在为职场新人提供实用的职场tips&#xff0c;帮助他们在职场中取得…...

SpringCloud Alibaba详解

目录 微服务架构概念 服务治理 服务调用 服务网关 服务容错 链路追踪 SpringcloudAlibaba组件 Nacos 负载均衡 Ribbon Fegin Sentinel 高并发测试 容错方案 Sentinel入门 Feign整合Sentinel 微服务架构概念 服务治理 服务治理就是进行服务的自动化管理&#xf…...

Golang每日一练(leetDay0065) 位1的个数、词频统计

目录 191. 位1的个数 Nnumber of 1-bits &#x1f31f; 192. 统计词频 Word Frequency &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...