C++赋值函数

2023-10-27

左值引用和右值引用

左值与右值:

左值:在内存中占有确定位置的对象,即左值占有内存。换句话来说,就是有地址,有值。

右值:不占内存(科学地讲是临时寄存器),仅有值,为临时变量。

左右值的切换:

右值->左值:用*符号。

int a=10;

int* b=&a;// b为右值。

*b=20;// b为右值,*b为左值。

左值->右值:用&符号。

int a = 10;

&a = 40;                  //错误:赋值操作要求一个左值
int* b = &(a + 1); //错误:‘&’运算符要求一个左值,a为左值,但a+1为右值。
int* c = &a;           //正确:var是左值

左值引用:将左值绑定在引用上。

第一种情况,函数返回右值。

int global = 10;
int test()
{
	return global;// 返回右值
}
int main()
{

	test() = 20;// error,右值不可赋值!
	cout << "test为:"<<test();
	return 0;
}

第二种情况,函数返回左值。

int global = 10;
int& test()
{
	return global;// 返回左值
}
int main()
{

	test() = 20;// 左值可赋值
	cout << "test为:"<<test();
	return 0;
}

测试:

说明了左值引用让函数调用可以赋值成为可能。

 常量左值引用和非常量左值引用:

int a1=20;              //非常量左值
const int a2=20;       //常量左值
const int a3=20;       //常量左值
 
//非常量左值引用
int &b1=a1;            //正确,a1是一个非常量左值,可以被非常量左值引用绑定
int &b2=a2;           //错误,a2是一个常量左值,不可以被非常量左值引用绑定
int &b3=20;           //错误,10是一个非常量右值,不可以被非常量左值引用绑定
int &b4=a2+a3;        //错误,(a2+a3)是一个常量右值,不可以被非常量左值引用绑定

//常量左值引用
const int &c1=a1;      //正确,a1是一个非常量左值,可以被非常量右值引用绑定
const int &c2=a2;     //正确,a2是一个常量左值,可以被非常量右值引用绑定
const int &c3=a1+a2;   //正确,(a1+a2)是一个非常量右值,可以被常量右值引用绑定
const int &c4=a2+a3;  //正确,(a2+a3)是一个常量右值,可以被非常量右值引用绑定

总结:

1.非常量左值引用只能绑定到非常量左值上;

2.常量左值引用可以绑定到非常量左值、常量左值、非常量右值、常量右值等所有类型。

(大->小,小引用绑大左值,常量左值范围更小嘛)

右值引用:将右值绑定在引用上。

常量右值引用和非常量右值引用:

int a1=20;             //非常量左值
const int a2=20;      //常量左值
const int a3=20;      //常量左值

//非常量右值引用
int &&b1=a1;            //错误,a1是一个非常量左值,不可以被非常量右值引用绑定
int &&b2=a2;           //错误,a2是一个常量左值,不可以被非常量右值引用绑定
int &&b3=20;           //正确,10是一个非常量右值,可以被非常量右值引用绑定
int &&b4=a2+a3;        //错误,(a2+a3)是一个常量右值,不可以被非常量右值引用绑定

//常量右值引用
const int &&c1=a1;      //错误,a1是一个非常量左值,不可以被常量右值引用绑定
const int &&c2=a2;     //错误,a2是一个常量左值,不可以被常量右值引用绑定
const int &&c3=a1+a2;   //正确,(a1+a2)是一个非常量右值,可以被常量右值引用绑定
const int &&c4=a2+a3;  //正确,(a2+a3)是一个常量右值,不可以被常量右值引用绑定

总结:

1.非常量右值引用只能绑定到非常量右值上;

2.常量右值引用可以绑定到非常量右值、常量右值上。

移动构造函数:

小狗狗类:

#include<string>
#include<iostream>
using namespace std;
class Dog
{
public:
	Dog(){};

	Dog(int age,string name) :m_age(new int(age)), m_name(name){}

	Dog(Dog& d):m_age(d.m_age),m_name(d.m_name) 
	{
		cout << "我是拷贝构造函数······" << endl;
	}
	Dog(Dog&& d) :m_age(d.m_age), m_name(d.m_name) 
	{
		d.m_age = nullptr;
		cout << "我是移动构造函数······" << endl;
	}

	int* m_age;
	string m_name;
};

 客户端类:

#include"construct.h"
int main()
{
	int age = 19;
	string name = "小狗狗";
	Dog d1(age, name);
	cout << "d1:" <<* d1.m_age << d1.m_name << endl;

	Dog d2(move(d1));

	bool is = d1.m_age == nullptr;
	cout << is << endl;

	cout << "d2.age:" << *d2.m_age <<endl<< "d2.name:" <<d2.m_name << endl;
	return 0;
}

测试:

 说明了移动构造运行成功,d1销毁了,d2获取到了d1的内存。

赋值和移动赋值函数:

赋值函数类:

#include<String>
using namespace std;
class Cat
{
public:
	Cat(){}
	Cat(int age ,string name):age(age),name(name) {}
	Cat& operator=(Cat& c)
	{
		if (this!= &c)
		{
			age = c.age;
			name = c.name;
		}
		return *this;
	}
	int age;
	string name;

};

 移动赋值函数类:

#include"assign.h"

class Dog
{
public:
	Dog() {}
	Dog(int age, string name) :age(new int(age)), name(name) {}

	Dog& operator=(Dog&& c)
	{
		age = c.age;
		name = c.name;
		c.age = nullptr;
		return *this;
	}
	int* age;
	string name;

};

客户端类:

#include<iostream>
#include"moveAssign.h"
int main()
{
	cout << "赋值函数" << endl;
	Cat c1(18, "小猫咪");
	Cat c2 ;
	c2 = c1;
	cout << "c1.age:" << c1.age << endl << "c1.name" << c1.name << endl;
	cout << "c2.age:" << c2.age << endl << "c2.name" << c2.name << endl<<endl;;

	cout << "移动赋值函数" << endl;
	Dog d1(19,"小狗狗");

	cout << "d1.age:" << *d1.age << endl << "d1.name" << d1.name << endl << endl;

	Dog d2;
	d2 = move(d1);
	bool is = (d1.age == nullptr);
	cout << "d1是否为空:" << is << endl;
	cout << "d2.age:" << *d2.age << endl << "d2.name" << d2.name << endl;
	return 0;
}

测试:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++赋值函数 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L

随机推荐

  • AGV轨迹matlab仿真,两轮差速AGV的轨迹跟踪控制研究 Study on Trajectory Tracking Control of Two-Wheel Difference Speed of...

    Software Engineering and Applications Vol 06 No 04 2017 Article ID 21608 9 pages 10 12677 SEA 2017 64007 Study on Trajec
  • QT学习14:QtXlsx操作Excel表

    一 前言 操作excel方式有 QAxObject 和QtXlsx 区别 Qt自带的QAxObject库操作excel的前提是电脑已经安装微软的Office 包含EXCEL 而QtXlsx可以直接使用免装Office且操作更简单 二 QtX
  • CNZZ埋点及点击量统计方法

    1 引入cnzz统计代码 document write unescape 3Cspan id 你的cnzzID 3E 3C span 3E 3Cscript src https s9 cnzz com z stat php 3Fid 3D1
  • Irrlicht引擎Shader渲染的BUG

    修改2 丢人了 回头一看原来的理解还是不够完整 如果在视图空间计算光照等 一般都会将法线变换到视图空间 想当然的做法是用视图矩阵来变换法线 这么做只有在物体没有缩放或是一致性缩放的情况下才是正确的 若是物体有非一致性缩放 uniform s
  • Python多版本管理工具--pyenv

    我们在平时的项目开发或者学习中 有可能使用不同的Python版本 大家都知道Python的版本非常多 如果我们把需要的不同版本的Python都下载到服务器上 管理起来会非常困难 多版本并存又容易互相干扰 搞不好整个服务器的Python环境会
  • WebSocked、SSE、http1.0、http1.1和http2.0之间的关系

    1 WebSocked是个啥 首先 WebSocked是html5搞出来的一种新的协议 所以和http没有什么联系 要说非要有联系就是他借用了http协议来完成一部分的握手 但它和http一样都是一种连接协议 建立在tcp协议之上 使用在应
  • 服务器端Windows系统下SVN配置

    服务器端Windows系统下SVN配置 在局域网或者公网上进行SVN配置 即客户端与服务器端不是同一台电脑 则服务器端需要利用相关软件进行相应配置 客户端配置请参见 Windows系统下SVN 本地配置 所需软件 Visual SVN Se
  • 实证研究的步骤_写一篇论文的大致步骤是什么呢?

    大部分写过论文的人都知道 完成一篇大论文 准备时间少则数月多则数年 一旦准备完成 论文不过数天或数周就可以完成 下面我们简单总结一下写一篇论文的大致步骤有哪些 一 选题 选题是否恰当 对于论文写作有非常大的影响 论文选题可以从本专业未研究过
  • 【仙女踩坑实录】VirtualBox设置中需要禁用硬件虚拟化才能启动虚拟机

    最近在用virtual box做实验 在设置中提示 需要禁用硬件虚拟化才能启动虚拟机 确认按钮灰色 并且无法启动虚拟机 于是重启 进到bios系统 网上说按F2或者根据电脑上的提示再开机的时候一直按就能进入 我没进去 不过幸好 之前设置过g
  • 【编译原理】LL(1)文法分析全过程(FIRST/FLLOW/SELECT集等)实现(c++语言)

    注 本程序只能进行LL 1 文法的分析 非LL 1 文法请转化为LL 1 文法 变量声明 string M 2000 2000 任务分析表 stack
  • JMX+Prometheus监控Grafana展示

    文章目录 概述 Java代码使用PrometheusApi统计监控指标 Prometheus Grafana展示 概述 最近在阅读InLong的源码 发现它采用通过JMX Prometheus进行指标监控 这里做了下延伸将介绍使用JMX P
  • 【配电网重构】高比例清洁能源接入下计及需求响应的配电网重构【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 数据 2 2 DG 与负荷 24 h 功率分布曲线 2 3 需求响应措施对重构结果的
  • 无需Avatarify 无需剪辑工具 一键生成多人版 “蚂蚁呀嘿“视频

    2021年3月1日更新2 1 调整人脸区域为椭圆 比圆形更贴合脸型 占用的面积变小 2 修复了人脸出现黑边的问题 如果人脸区域不合适 可调整ratio参数 2021年3月1日更新 1 调整人脸区域为圆形 更贴合脸型 占用的面积变小 2 增加
  • .net C#反编译及脱壳常用工具--小结

    1 Reflector 微软自家工具 推荐 Reflector是最为流行的 Net反编译工具 Reflector是由微软员工Lutz Roeder编写的免费程序 Reflector的出现使 NET程序员眼前豁然开朗 因为这个免费工具可以将
  • gin 十. gin-contrib之secure 支持https与安全设置

    目录 一 实现https 二 防止XSS CSRF 一 实现https gin默认是http接口 前面也了解到gin中存在一个子包 gin contrib secure 内部提供了一些安全相关的中间件 例如HTTPS重定向 内容安全策略 C
  • VS2017社区版30天到期无法使用的激活方法

    VS2017社区版30天到期无法使用的激活方法 VS2017社区版是免费的 但是第一次安装时 没有登录 导致只要30天的试用期 现在试用期结束 无法使用 本教程就是解决这个问题 我先在控制面板中将2017社区版软件卸载了 其实 事实证明完全
  • Camunda并行任务的处理

    在工作流的编排中 有些时候会同时运行多个任务或子进程 默认的方式是串行运行 但是为了提高性能 我们会希望能并行运行 我也进行了一些测试 发现这个并行运行还不是这么简单的 举个例子 我们现在定义一个流程 这个流程很简单 就是调用一个Http接
  • Unity中启动外部文件

    启动指定文件夹中的文件 按照其默认的打开方式 例如 1 mp4格式的会使用电脑的视频播放器 2 ppt格式的会使用office或者wps启动 UnityEngine Application OpenURL file Application
  • Unity关联 VS2017/VS2019,visual studio tools for unity

    1 打开VS2017 打开工具 获取工具和功能 下载如下所示 2 3 选择Assets 再选择import package 选择custom package 再找到Visual Studio 2017 Tools 位置一般在C Progra
  • C++赋值函数

    左值引用和右值引用 左值与右值 左值 在内存中占有确定位置的对象 即左值占有内存 换句话来说 就是有地址 有值 右值 不占内存 科学地讲是临时寄存器 仅有值 为临时变量 左右值的切换 右值 gt 左值 用 符号 int a 10 int b