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第一天 ...
随机推荐
- CSS——圆角
例子1: <!DOCTYPE html> <html lang="en"> <head> <style> div { width: ...
- mysql笔记第一天: 介绍和MySQL编译安装
一.DBA的工作内容:  ...
- mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.
在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...
- 使用Express写接口
接口规范 随着前后端分离越来越普遍, 后端接口规范也就越来越重要了,一套良好的接口规范可以提升工作效率, 减少沟通障碍.通常我们都会采用RestfulApi方式来提供接口, 使用 JSON 来传输数据 ...
- web框架及Django简介
WEB框架 Web框架是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法. web框架已经实现了很多功能 ...
- 说一下 JSP 的 4 种作用域?
page:代表与一个页面相关的对象和属性. request:代表与客户端发出的一个请求相关的对象和属性.一个请求可能跨越多个页面,涉及多个 Web 组件:需要在页面显示的临时数据可以置于此作用域. s ...
- C#.NET与JAVA互通之DES加密V2024
C#.NET与JAVA互通之DES加密V2024 配置视频: 环境: .NET Framework 4.6 控制台程序 JAVA这边:JDK8 (1.8) 控制台程序 注意点: 1.由 ...
- iOS:长图切割并转为动画gif——精灵表单sprite Sheet的转化
iOS:长图切割并转为动画gif--精灵表单sprite Sheet的转化 通常的,iOS显示gif可以将文件转为NSData后再对其进行解析,通过CADisplayLink逐帧进行提取.播放,判断N ...
- Android无障碍自动化结合opencv实现支付宝能量自动收集
Android无障碍服务可以操作元素,手势模拟,实现基本的控制.opencv可以进行图像识别.两者结合在一起即可实现支付宝能量自动收集.opencv用于识别能量,无障碍服务用于模拟手势,即点击能量. ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(2)
1.问题描述: 怎么判断登录的华为帐号有变动? 解决方案: 华为帐号登录成功后会返回唯一标识OpenID和UnionID,如果切换不同的华为帐号登录,这个唯一标识会变. OpenID是华为帐号用户在不 ...