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第一天 ...
随机推荐
- 流式响应Web小工具实践
作为一位拥有多年经验的老程序员,我对于提升Web应用性能和用户体验有些兴趣.今天,我要和大家聊聊一个非常实用的技术--流式响应(Streaming Response). 首先,流式响应到底是什么呢?简 ...
- 【BI 可视化插件】怎么做? 手把手教你实现
背景 对于现在的用户来说,插件已经成为一个熟悉的概念.无论是在使用软件. IDE 还是浏览器时,插件都是为了在原有产品基础上提供更多更便利的操作.在 BI 领域,图表的丰富性和对接各种场景的自定义是最 ...
- Ubuntu20.04安装MySQL5.7
ubuntu 20.04系统自带源直接安装的是MySQL 8.0,要安装MySQL 5.7的话,需要先换源. 1.换源 sudo cp /etc/apt/sources.list /etc/apt/s ...
- golang的 CGO 是什么
CGO是Go(Golang)语言中的一个工具,全称为 "C-Go" 或者 "C for Go". 它是Go标准库的一部分,允许Go代码与C语言代码进行交互. C ...
- MQ的相关概念
MQ的相关概念 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下 ...
- 7.11考试总结(NOIP模拟11)[math·biology·english]
吾于冥河沉浮,受尽命运捉弄,纵然汝将忘吾,吾亦伴汝身旁. 前言 考试的时候本来一看 T2 一见如故,决定 231 开题,然后瞅了一眼 T3 的题面,似曾相识. 仔细看了一眼,这,这不是差异吗,然后果断 ...
- TIM_Cmd()函数引发的思考
在使用定时器的输入捕获进行频率测量时发现用TIM_Cmd()函数关闭定时器后,输入捕获中断还是会被触发,这就很奇怪了,输入捕获是定时器的一种模式,关闭定时器不就意味着输入捕获捕获也被关闭了吗?可是实际 ...
- css 跑马灯
html: <view class="in_scro"> <view class="in_scrview">恭喜139******1用户 ...
- 手摸手教你把Ingress Nginx集成进Skywalking
背景 在微服务大行其道的今天,如何观测众多微服务.快速理清服务间的依赖.如何对服务之间的调用性能进行衡量,成了摆在大家面前的难题.对此,Skywalking应运而生,它是托管在 Apache 基金会下 ...
- Uncaught TypeError: $(...).datagrid is not a function
项目中碰见异常"Uncaught TypeError: $(...).datagrid is not a function",网上查询基本上都是jQuery的重复引用,但是找了半天 ...