施磊C++ | 进阶学习笔记 | 1.对象的应用优化、右值引用的优化

一.对象的应用优化、右值引用的优化

文章目录

    • 一.对象的应用优化、右值引用的优化
      • 1.1 构造,拷贝,赋值,析构中的优化
        • 课后练习:
      • 1.2 函数调用过程中对象背后调用的方法
      • 1.3 对象优化三原则
      • 1.4 右值引用、move移动语意、完美转发

1.1 构造,拷贝,赋值,析构中的优化

#include<iostream>
using namespace std;class test
{
public:test(int a = 10) :ma(a) { cout << "test(int)" << endl; }~test() { cout << "~test" << endl; }test(const test& t) :ma(t.ma) { cout << "test(const &)" << endl; }test& operator=(const test& t){cout << "operator=" << endl;ma = t.ma;return *this;}
private:int ma;
};int main()
{test t1;//构造test t2(t1);//拷贝test t3 = t1;//拷贝//临时对象生存周期就是这个语句/*1.C++编译器对于对象构造的优化:用临时对象生成新对象的时候,临时对象就不产生了,直接构造新对象就可以了*/test t4 = test(20);//相当于 test t4(20); 而不是先用临时对象构造,临时对象拷贝,然后临时对象析构,这样效率太低了就给优化了cout << "--------" << endl;t4 = t2;//赋值//2.显式生成临时对象//t4.operator=(const Test &t)这个临时对象会产生,因为要给参数t赋值,传参t4 = test(30);// 依次调用 构造 赋值 析构t4 = (test)30;//有合适的构造函数可以隐式的生成一个临时对象然后给t4,没有合适的就报错//隐式生成临时对象t4 = 30;//这3句等价//3. 临时对象,指针和引用// 指针指向临时对象不安全,但是引用是安全的//p指向的是一个已经析构的临时对象,变成了野指针test* p = &test(40);//但是引用是可以的,因为是起了一个别名,给一块内存重新按了一个名字,就可以继续用,所以是安全的const test& ref = test(50);//4.全局变量是在main函数之前就完成了初始化的//5.test *p1=new test(70) 调用一次构造函数 只有在delete的时候才调用析构//6.test *p2=new test[2] 调用两次构造//7.delete p1 调用析构然后才释放内存//8.delete []p2 两次析构然后调用free释放整个内存 return 0;
}
课后练习:

image-20241009213117219

1.2 函数调用过程中对象背后调用的方法

#include<iostream>
using namespace std;class test
{
public:test(int a = 10) :ma(a) { cout << "test(int)" << endl; }~test() { cout << "~test" << endl; }test(const test& t) :ma(t.ma) { cout << "test(const &)" << endl; }test& operator=(const test& t){cout << "operator=" << endl;ma = t.ma;return *this;}int getData() const { return ma; }
private:int ma;
};test GetObject(test t)//不能返回局部的或者临时对象的指针或引用
{int val = t.getData();test tmp(val);return tmp;
}int main()
{//背后调用了哪些函数呢?test t1;//1.test(int)test t2;//2.test(int)t2 = GetObject(t1);//3.test(const test&) t1->t 实参到形参是一个初始化的过程不是第一个赋值的过程,这里用t1初始化形参t//4.test(int) 初始化tmp// 5.test(const test&) tmp拷贝给一个临时对象//5.tmp 析构//6.t析构//7.operator 赋值 给t2//8.临时对象析构//9.t2析构//10.t1析构return 0;
}

1.3 对象优化三原则

1.函数参数传递过程中,对象优先按引用传递,不要按照值传递(实参到形参不需要构造和析构函数调用)

2.函数返回对象的时候,优先考虑返回一个临时对象,而不是一个定义过的对象

//注意加了引用
test GetObject(test &t)//改成这样以后,调用会少了tmp的构造和析构,又少了两个调用
{int val = t.getData();return test(val);
}

3.接收函数返回值是对象的函数调用的时候,优先按初始化的方式接收,不要按复制的方式接收

#include<iostream>
using namespace std;class test
{
public:test(int a = 10) :ma(a) { cout << "test(int)" << endl; }~test() { cout << "~test" << endl; }test(const test& t) :ma(t.ma) { cout << "test(const &)" << endl; }test& operator=(const test& t){cout << "operator=" << endl;ma = t.ma;return *this;}int getData() const { return ma; }
private:int ma;
};
//注意,加了引用
test GetObject(test &t)//不能返回局部的或者临时对象的指针或引用
{int val = t.getData();test tmp(val);return tmp;
}int main()
{//背后调用了哪些函数呢?test t1;//1.test(int) 构造t1 test t2 = GetObject(t1);//2.test(int) 直接构造t2//3.t2析构//4.t1析构//test t2;//t2 = GetObject(t1);return 0;
}

1.4 右值引用、move移动语意、完美转发

请转至C++11 新特性 学习笔记-CSDN博客进行学习

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThingsBoard规则链节点:Clear Alarm节点详解

引言 Clear Alarm 节点含义 使用场景 实际项目中的运用场景 智能建筑管理系统 工业生产线监控 远程医疗监护 结论 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;它提供了设备管理、数据收集、处理和可视化等功能。在 ThingsBoard 中&#xff0c;规则链&#xff…

QExcel 保存数据 (QtXlsxWriter库 编译)

QtXlsxWriter 是一个用于在 Qt 应用程序中创建和操作 Excel XLSX 文件的库。它提供了一个简单的 API&#xff0c;使开发者能够轻松地生成和修改 Excel 文件&#xff0c;而无需依赖 Microsoft Excel 或其他外部应用程序。支持初始化、写文件、读文件、格式设置、合并单元格、加粗…

scala 高阶函数 (下)

一.fold fold的作用 idea实例 二.sorted函数 sort基础知识 idea实例 三.sortWith sortWith基础知识 idea实例

音乐播放器项目专栏介绍​

1.简介 本专栏使用Qt QWidget作为显示界面&#xff0c;你将会学习到以下内容&#xff1a; 1.大量ui美化的实例。 2.各种复杂ui布局。 3.常见显示效果实现。 4.大量QSS实例。 5.Qt音频播放&#xff0c;音乐歌词文件加载&#xff0c;展示。 6.播放器界面换肤。 相信学习了本专栏…

Java学习-JUC

目录 1. 简介 2. Atomic包 2.1 什么是原子类 2.2 Atomic包里的类 3. CAS 3.1 CAS是什么 3.2 Java中对CAS的实现 3.3 CAS的缺陷 4. JUC里面的常见锁 4.1 锁分类 4.1.1 按上锁方式划分 4.1.2 按特性划分 4.1.3 其他锁 4.2 Synchronized和JUC的锁对比 5. 锁原理分析…

智慧园区能带来哪些便利?

所谓智慧园区&#xff0c;是指通过信息化手段&#xff0c;实现园区内各项业务的数字化和智能化管理。园区管理者可以利用智能化平台实时监控各项运营情况&#xff0c;如能源使用、安全监控和物流运输等&#xff0c;及时调整管理策略&#xff0c;提高运营效率。智慧园区利用大数…

pycharm 找不到conda环境

参考&#xff1a;新版Pycharm解决Conda executable is not found-CSDN博客

WNMP环境本地搭建并配置公网地址远程搭建动态网站或服务器

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 本教程主要介绍如何在Windows系统电脑本地下载安装 Wnmp&#xff0c;以及结合cpolar内网穿透工具一键配…

【C++】——多态(上)

【C】——多态&#xff08;上&#xff09; 1 多态的概念2 多态的定义及实现2.1 多态的构成条件2.1.1 实现多态的必要条件2.1.2 虚函数2.1.3 感受多态2.1.4 判断是否满足多态2.1.5 多态场景的一道选择题2.1.6 虚函数重写的一些其他问题2.1.6.1 协变2.1.6.2 析构函数的重写 2.1.7…

深度学习-26-基于PyTorch的多层感知机DNN

文章目录 1 代码分析1.1 加载数据集1.2 定义模型1.3 定义损失函数和优化器1.4 定义训练函数1.4.1 定义累加器Accumulator1.4.2 计算准确率accuracy1.4.3 评估函数evaluate_accuracy1.4.4 单轮训练函数train_epoch1.4.5 训练函数train1.2 执行训练2 整体代码3 参考附录1 代码分析…

使用Python构建一个高级计算器

使用Python构建一个高级计算器 在现代编程中&#xff0c;构建一个功能强大的计算器不仅是学习编程的好项目&#xff0c;还有助于提高对数据处理和用户交互的理解。本文将带您通过使用Python构建一个高级计算器&#xff0c;该计算器支持基本运算、科学运算以及简单的图形用户界…

将SpringBoot项目部署到linux服务器使得本地可以访问

首先我们要先从本地打包jar文件上传到linux中&#xff0c;这些的步骤可以参考其他打包上传的博客哈 打包上传后&#xff0c;可以看到对应的 .jar 文件 如果这样直接运行java -jar code-sandbox-0.0.1-SNAPSHOT.jar 是不行的&#xff0c;因为你还没有在服务器上开放端口&#x…

ubuntu中使用cmake编译报错No CMAKE_CXX_COMPILER could be found.的解决方法

ubuntu中使用cmake编译报错No CMAKE_CXX_COMPILER could be found.的解决方法 No CMAKE_CXX_COMPILER could be found.Could NOT find CUDA (missing: CUDA_NVCC_EXECUTABLE CUDA_CUDART_LIBRARY)Could not find a package configuration file provided by "OpenCV" …

中国制造业精益生产管理的现状与挑战

在当今全球制造业竞争日益激烈的背景下&#xff0c;精益生产管理作为一种高效、灵活的生产模式&#xff0c;已成为众多企业追求的核心竞争力之一。然而&#xff0c;尽管精益生产理念在中国制造业中已得到广泛传播和应用&#xff0c;其实践水平却参差不齐&#xff0c;多数企业仍…

Ansible概述

目录 一、ansible简介 二、absible的特点 三、ansible的工作原理以及流程 四、ansible环境安装部署 五、ansible命令行模块 六、inventory 主机清单 一、ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。…

解决ultralytics中的YOLOv8在执行task.py文件添加模块操作出现的KeyError报错

报错详情&#xff1a; 在ultralytics项目文件夹内运行/home/xxx/ultralytics/train.py进行单GPU训练的时候训练可以正常进行 from ultralytics import YOLO# Load a model model YOLO("/home/xxx/ultralytics/ultralytics/cfg/models/v8/yolov8s-FASFF.yaml") # …

3.C++经典实例-计算一个数的阶乘

阶乘&#xff08;factorial&#xff09;是‌基斯顿卡曼于1808年发明的运算符号&#xff0c;用于表示一个正整数n的所有小于及等于该数的正整数的积。自然数n的阶乘写作n!。例如&#xff0c;5的阶乘表示为5! 1 2 3 4 5 120。 阶乘在数学和计算机科学中有广泛的应用。例如…

git--git reset

HEAD 单独一个HEAD eg:git diff HEAD 表示当前结点。 HEAD~ HEAD~只处理当前分支。 注意&#xff1a;master分支的上一个结点是tmp分支的所在的结点fc11b74, 79f109e才是master的第二个父节点。 HEAD~ 当前结点的父节点。 HEAD~1 当前结点的父节点。 HEAD~n 当前结点索…

react+video:限制快进、倍速、画中画

实现代码&#xff1a; <video ref{videoRef} src{videoUrl} className{style.video} controls onRateChange{rateChange} onPlay{playVideo} onPause{pauseVideo} onTimeUpdate{timeUpdate} disablePictureInPicture playsInline poster{poster} controlsList"nodownl…

Qml-Item的构造和显示顺序

Qml-Item的构造和显示顺序 qml文件中组件构造顺序 在同一个qml文件中&#xff0c;同层级的Item, 文件尾的Item优先构造&#xff0c;文件首的Item后构造。这就能解释默认情况下同一个qml文件中&#xff0c;几个同层级的item都设置了focus:true&#xff0c;为啥最上面item最终有…