c++ 关于返回值、将亡值的调用研究
c++11引入右值引用,而出现右值引用的有这几种:返回值(将亡值),常量。
class Obj
{
public:
Obj() { cout << "构造函数" << endl; }
~Obj() { cout << "析构函数" << endl; }
Obj(const Obj& l)
{
cout << "拷贝构造函数" << endl;
}
/* Obj(Obj&& l)
{
cout << "移动构造函数" << endl;
}*/ void operator=(Obj& r)
{
cout << "赋值函数" << endl; }
void operator=(Obj&& r)
{
cout << "移动赋值函数" << endl;
} };
Obj getObj()
{
Obj oo;
return oo;
} void Call(Obj o)
{
cout << "Call" << endl;
} int main()
{
// Obj o;
Obj o = getObj();
cout<<"obj call"<<endl;
Call(getObj());
return 0;
}
Obj对象如果没有移动构造函数,那么Call(getObj()), 这里产生的Obj临时对象,会进入Call的时候会调用拷贝构造函数,如果有移动构造函数,则使用移动构造函数,如果都没有则编译不过去,拷贝构造函数和移动构造函数至少有一个。
Obj o = getObj();接收赋值这一块延长了返回值的生命周期,而getObj的最终返回值也同样是调用的移动构造函数或者拷贝构造函数,移动构造函数优先。
延长的时间为o的生命周期,getObj()如果被Call调用的时候,Call函数对象的调用延长了getObj函数的生命周期。
运行结果 会有一次构造函数,一次拷贝构造函数,析构函数会看是否有人接收或者直接调用来延长其生命周期
由于目前的限制,编译器使用的是VS,为了尽可能的减少对象的构造,以及延长生命周期
#include <iostream>
using namespace std;
class Obj
{
public:
Obj() { cout << "构造函数" << endl; }
~Obj() { cout << "析构函数" << endl; }
Obj(const Obj& l)
{
cout << "拷贝构造函数" << endl;
}
Obj(Obj&& l)
{
cout << "移动构造函数" << endl;
} void operator=(Obj& r)
{
cout << "赋值函数" << endl; }
void operator=(Obj&& r)
{
cout << "移动赋值函数" << endl;
} };
Obj&& getObj()
{
Obj oo;
return move(oo);
} void Call(Obj o)
{
cout << "Call" << endl;
} int main()
{
// Obj o;
Obj o = getObj();
cout << "obj call" << endl;
//Call(getObj());
return 0;
}
目前的实验方式中,只是将已经析构的将亡值的右值引用抬了出来。如何延长其生命周期??
c++ 关于返回值、将亡值的调用研究的更多相关文章
- C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...
- 【原创】C++11:左值和右值(深度分析)
——原创,引用请附带博客地址 2019-12-06 23:42:18 这篇文章分析的还是不行,先暂时放在这以后再更新. 本篇比较长,需要耐心阅读 以一个实际问题开始分析 class Sub{} Sub ...
- 详解 C++ 左值、右值、左值引用以及右值引用
一.左值和右值 1.左值 [可以取地址的对象就是左值] 左值是一个表示数据的表达式,比如:变量名.解引用的指针变量.一般地,我们可以获取它的地址和对它赋值,但被 const 修饰后的左值,不能给它赋值 ...
- 话说C++中的左值、纯右值、将亡值
写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- C++雾中风景10:聊聊左值,纯右值与将亡值
C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...
- 调试台自动多出现一个'' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个''
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...
- <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...
- Python函数返回不定数量的值
Python的函数是可以return多个值的,但其本质上还是返回单个值,只是利用了tuple的自动打包,将多个值打包成单个tuple返回. 使用代码验证: def func_a(): return 1 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
随机推荐
- 内存取证——volatility学习
前言 在做计算机最后两道题目碰到了MP3格式的镜像,分析发现是计算机内存,要进行内存取证.现在内存取证在ctf比赛中也是常见的题目,内存取证是指在计算机系统的内存中进行取证分析,以获取有关计算机系统当 ...
- 行列式求值,从 $n!$ 优化到 $n^3$
前置知识 \(\sum\) 为累加符号,\(\prod\) 为累乘符号. 上三角矩阵指只有对角线及其右上方有数值其余都是 \(0\) 的矩阵. 如果一个矩阵的对角线全部为 \(1\) 那么这个矩阵为单 ...
- 7.12考试总结(NOIP模拟12)[简单的区间·简单的玄学·简单的填数]
即使想放弃,也没法放弃最想要的东西,这就是人 前言 这次应该是和 SDFZ 一起打的第一场比赛吧. 然而我还是 FW 一个... 这次考试也有不少遗憾,主要的问题是码力不足,不敢去直面正解,思考程度不 ...
- Github Markdown 指定图片在光亮或暗黑模式展示
Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...
- CF98C Help Greg the Dwarf 题解
CF98C Help Greg the Dwarf 题解 为什么不三分? 首先我们考虑如何求出答案. 如图,考虑设夹角为 \(\theta\),那么可以得到表达式: \[[\cfrac a {\tan ...
- Kali Linux 终端字体配色
在用root用户登录Kali Liunx时,会发现终端的字体无配色,非常难看,以下这幅图便是kali用户和root用户的区别,看着真难受. echo $PS1,这便是区别所在. 那我们怎么让root用 ...
- com.netflix.hystrix.exception.HystrixBadRequestException: null
com.netflix.hystrix.exception.HystrixBadRequestException: null 排查方法:如果有多个feign接口的调用,可以在每个调用的方法加上try- ...
- Elasticsearch之Nested Query nestedQuery查询数组
es是通过符合条件的json记录找出来,本身并不是将数据中的记录filter过滤.es nestedQuery不是过滤的结果,是匹配的这条es记录,所以数组中的其他的记录也会查询出来1.方法1:可以在 ...
- 【UnityTips】如何自定义脚本模版
[UnityTips]如何自定义脚本模版 通常我们创建新脚本时大家看到的是这个样子: using System.Collections; using System.Collections.Generi ...
- Apache Kylin(二)在EMR上搭建Kylin
EMR上搭建kylin 1. 启动EMR集群 根据官网说明: http://kylin.apache.org/docs21/install/kylin_aws_emr.html 启动EMR时,若是 h ...