当前位置: 首页 > 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…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...