运算符重载,运算符+与运算符+=

2023-12-15

我正在阅读一些 C++ 源代码,并且了解了一些语法。

path& path::operator+=(string postPath)

我想知道这是否是实际的语法以及为什么 c++ 不使用已经存在的运算符+,而是将值应用于有问题的对象。

就像您想确保对象被正确删除一样。但析构函数应该处理所有这些。

-Edit1

我知道 a += b; 之间有区别和a+b;
我想知道为什么c++不只使用operator+和+=,而不是像operator+一样重新定义operator+=

-Edit2

我不确定它是否正确,但我想问的是为什么该语言不基于 + 推断 += 。 现在我意识到+=的其他用途。感谢大家 :)


  1. 可能存在效率问题;如果你的对象复制/分配的成本很高,a+=b可能会节省您的临时构造、复制构造和分配,并允许您更好地利用目标对象中已有的资源。如果std::vector had a +=运算符来连接向量,直接实现它会更有效(您可以利用目标对象的额外容量并避免无用的分配),而不是创建一个临时和向量(“从头开始”)并分配它。

    实际上,通常我实施+按照+=,通常它会产生更高效且更易于编写的代码;像这样:

    T &operator+=(const T &r)
    {
        // say that T encapsulates an N-dimensional array
        for(int i=0; i<N; ++i)
            arr+=r.arr[i];
        return *this;
    }
    
    T operator+(const T &r)
    {
        T ret(*this);
        ret+=r;
        return ret;
    }
    

    (尽管我同意有一种方法可以要求编译器合成+/-来自现有运营商;关系运算符也是如此)

  2. 您可能想要一个可以添加某些内容但不能复制/分配的对象。例如,对于我的一个玩具项目,我曾短暂考虑过使用重载的信号对象(例如 boost 或 Qt,或 .NET 事件/多播委托)+=添加连接(Signal &operator+=(std::function<T...> fn)),但我不想处理赋值/复制语义(恕我直言,信号没有意义);

  3. 归根结底,有一个普遍的想法:在 C++ 中,您可以重载(几乎)所有运算符,让它们做您想做的任何事情,而无需特殊的语义限制。你可以写一个operator+发射火箭和operator+=删除硬盘上的所有文件 - 由您负责,如果这对您的应用程序有意义,您可以自由地执行此操作,没有特殊限制。

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

运算符重载,运算符+与运算符+= 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • 实体框架 Code First 的 SQL Server Express 连接字符串

    我正在使用 Visual Web Developer 2010 Express 并使用实体框架代码优先 CTP 我可以使用新的 SQL Server CE 执行此操作 但无法找到与 SQL Server Express 一起使用的连接字符串
  • 如何在数据框列上进行标量乘法

    我确信这个就坐在我面前 但我看不到它 我有一个数据框 a 这样 gt a Chars Numbers This A 15 That B 22 Other C 18 我只想将 Numbers 列乘以一个标量 例如 b 不起作用的是 a b 尝
  • 如何使用 Alamofire 和 SwiftyJSON 访问嵌套 JSON 值?

    我正在尝试使用 swiftyJSON 和 Alamofire 访问嵌套的 JSON 结果 我的打印值为零 我相信我没有正确执行此操作 我的参数应该是什么 我正在尝试获取位于的报价值http quotes rest qod json func
  • 通过VBA控制Excel形式的数据库

    我正在尝试创建一个 Excel 插件 它具有一组函数来从数据库中提取值 我使用 MS SQL Server 所以我的查询将只返回一个记录集 我在我的 vba 代码中使用如下所示的内容 使用 Excel VBA 运行 SQL 查询 但问题是
  • 在 Pygame 中获取旋转图像的旋转矩形

    我有一个关于 pygame rect 的问题 矩形不是我想要的 我发现我可以用精灵类来做到这一点 但我不想使用精灵 我不明白 Sprite 矩形和图像矩形的区别 I want to get rect like this But I am g
  • C# 等待用户在文本框中输入完毕

    C 中是否有一种方法可以等到用户在文本框中完成输入后再获取他们输入的值而不按 Enter 键 稍微修改一下这个问题 好吧 我有一个简单的乘以 2 的计算器 这是我想要它做的事情 用户在文本框中输入一个值 例如 1000 它会自动显示 200
  • R脚本从谷歌分析导入数据

    我正在尝试通过 R studio 服务器上运行的脚本连接到 google analytic s API 我已按照本教程中的步骤操作 http www r bloggers com how to extract google analytic
  • 将 && \ 添加到文本文件中除最后一行之外的每一行

    我正在尝试添加 在文本文件中除最后一行之外的每一行的末尾 输入示例 ps mkdir repo cd repo touch file1 txt 预期输出 ps mkdir repo cd repo touch file1 txt 第一次尝试
  • 如何在使用 QnA 机器人时对其进行训练?

    我使用 bot framework SDK3 和 QnAmaker 服务制作了一个 QnA 机器人 据我所知 我们可以训练我们的知识库 但我不知道如何在团队等其他渠道中使用我的 QnA 机器人时对其进行训练 我想我可以让用户判断机器人的回答
  • subprocess.call() 和 os.system() 之间的速度差异

    执行速度是否有任何差异subprocess call and os system 命令 假设命令本身完全相同 我知道有很多帖子谈论子流程的好处及其原因os system 应该被抛弃 但没有人提到它们的速度 据我了解 子流程远不及包装器os
  • JSON 序列化以元组为键的字典

    Python 有没有办法序列化使用元组作为键的字典 e g a 1 2 a 简单地使用json dumps a 引发此错误 Traceback most recent call last File
  • 将 firestore“integer_value”转换为整数

    使用 Golang Firestore 1 8 库 我尝试使用 Google 去年秋天推出的 Firestore 的新 count 函数 这些文档似乎还没有示例 不是我发现的 但我拼凑了一些有点可行的代码 这些代码几乎让我完成了所有工作 只
  • WPF 拖放

    如何为 WPF 应用程序实现拖放 我可以打开 2 个相同的应用程序并将一个对象从一个应用程序拖动到另一个应用程序 这是我要拖动的内容
  • 按行重塑数据框[重复]

    这个问题在这里已经有答案了 我有一个类似于以下示例的数据框 gt df lt data frame imp c Johny Johny Lisa Max item c 5025 1101 2057 1619 gt df imp item 1
  • 仅最初需要 git 子模块更新?

    我正在掌握 git 子模块 一厢情愿的想法 并且我提出了更具体的问题 这是一个好兆头 我试图找到超级项目引用的子模块的哪个版本 在 gitmodules and git config 但那里没有提到任何内容 这种情况是 我正在更改根位置的子
  • 与 HoloEverywhere 的相对 Gradle 项目依赖性

    我有这个目录结构 Project contrib holo everywhere library addons slider preferences app library app one app two settings gradle 我
  • 保留选定的打印机设置

    我有一个应用程序 它运行一系列预订 并以行程的形式依次打印每个预订并发送给客户 每次运行可能有 30 个左右的预订 因此需要自动化 我们已经交付了它 所有这些都可以与我们的报告软件 DELPHI 的 Report Builder 配合使用
  • 使用 / 分割 C++ 字符串

    我有一个 C 字符串 如下所示 dirname filename ini 我需要在之后得到一切 我怎样才能做到这一点 Using find and substr方法来自std string std string fullpath dirna
  • 模块构建失败(来自 ./node_modules/postcss-loader/src/index.js)

    当我运行命令时 我正在使用角度和节点npm start我收到这个错误 src styles scss 中的错误 node modules css loader dist cjs js ref 13 1 node modules postcs
  • 运算符重载,运算符+与运算符+=

    我正在阅读一些 C 源代码 并且了解了一些语法 path path operator string postPath 我想知道这是否是实际的语法以及为什么 c 不使用已经存在的运算符 而是将值应用于有问题的对象 就像您想确保对象被正确删除一