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++ 关于返回值、将亡值的调用研究的更多相关文章

  1. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  2. 【原创】C++11:左值和右值(深度分析)

    ——原创,引用请附带博客地址 2019-12-06 23:42:18 这篇文章分析的还是不行,先暂时放在这以后再更新. 本篇比较长,需要耐心阅读 以一个实际问题开始分析 class Sub{} Sub ...

  3. 详解 C++ 左值、右值、左值引用以及右值引用

    一.左值和右值 1.左值 [可以取地址的对象就是左值] 左值是一个表示数据的表达式,比如:变量名.解引用的指针变量.一般地,我们可以获取它的地址和对它赋值,但被 const 修饰后的左值,不能给它赋值 ...

  4. 话说C++中的左值、纯右值、将亡值

    写在前面 C++中有“左值”.“右值”的概念,C++11以后,又有了“左值”.“纯右值”.“将亡值”的概念.关于这些概念,许多资料上都有介绍,本文在拾人牙慧的基础上又加入了一些自己的一些理解,同时提出 ...

  5. c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用

    为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...

  6. C++雾中风景10:聊聊左值,纯右值与将亡值

    C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...

  7. 调试台自动多出现一个'&#65279;' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个'&#65279;'

    对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...

  8. <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY

    MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...

  9. Python函数返回不定数量的值

    Python的函数是可以return多个值的,但其本质上还是返回单个值,只是利用了tuple的自动打包,将多个值打包成单个tuple返回. 使用代码验证: def func_a(): return 1 ...

  10. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

随机推荐

  1. c#动态执行脚本的3种方式详解

    1.使用Roslyn编译器 2.使用IronPython或IronRuby 3.使用JavaScript引擎 在C#中,可以使用一些第三方库或内置类库实现动态执行脚本的功能.以下是几个常用的方案: 1 ...

  2. 领域驱动设计(Domain-Driven Design,简称DDD)【简介 个人学习笔记】

    找到了第 1 篇资料:领域驱动设计详解:是什么.为什么.怎么做? - 知乎 找到了第 2 篇资料:领域驱动架构(DDD)建模中的模型到底是什么? - 知乎 找到了第 3 篇资料:一文看懂DDD 领域驱 ...

  3. C#开发的股票盯盘小工具——摸鱼助手,附源码

    写了个盯盘小工具,最近发现很多炒股的小伙伴,上班期间看手机频繁是不是影响不好?电脑上打开交易软件,那影响是不是更不好?所以我就写了个小工具,给大家"摸鱼"用.虽然是摸鱼用,但是平常 ...

  4. 8.26考试总结(NOIP模拟48)[Lighthouse·Miner·Lyk Love painting·Revive]

    告诉我,神会流血吗?--神不会,但你会. 前言 我直接打娱乐赛 T1 Lighthouse 解题思路 子集反演(但是 fengwu 硬要说是二项式反演咱也没法...) 发现其实 \(m\) 的值非常的 ...

  5. 8.5考试总结(NOIP模拟31)[Game·Time·Cover]

    我们总是在注意错过太多,却不注意自己拥有多少. 前言 考场上疯狂搞第一题,终于把人给搞没了.. T1 Game 解题思路 线段树+二分 总体来讲就是用线段树维护三个值: 没有产生贡献的 a(小 B 的 ...

  6. C#.NET FRAMEWORK ASP.NET MVC 获取客户端IP

    C#.NET FRAMEWORK ASP.NET MVC 获取客户端IP 工具类: using System; namespace CommonUtils { public static class ...

  7. 模拟登录之web监控

    1.什么是web监控 zabbix除了能通过 脚本+自定义key,实现服务器数据提取监控以外 也支持对网页的HTTP请求.响应监控. 2.web监控需求 以zabbix-UI页面的登录监控,模拟登录, ...

  8. JavaScript通过递归实现深拷贝

    思路 首先是用Object.prototype.toString.call(obj)来得到传入的值的类型,如果是几个基本类型,则直接返回值就可以了 如果是引用类型,则通过深拷贝函数递归进行再次拷贝. ...

  9. leetcode-3-无重复字符的最长子串-javascript

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  10. Springboot3.0+spring6.0+JDK17+配置jsp和打war包

    由于某些缘故,公司的产品需要升级,但并不希望花费大量时间重写前端代码(原来的就不是前后分离的).所以虽然spring和springboot都升级为最新的版本,但是依然还是需要支持jsp,并继续用打包为 ...