C++ 中运算符重载中的参数数量

2024-01-17

我正在学习 C++,并且创建了两个简单的 hello-world 应用程序。在这两个例子中我都使用了运算符重载,但问题就在这里。对于第一个,我可以为重载运算符提供两个参数,这很好。

Header:

enum Element {a,b,c,d,e};
Element operator + (Element x, Element y);
//more overloads for -, *, / here

Source:

Element operator + (Element x, Element y) {
    return ArrayOfElements[x][y];
}

但在我的第二个应用程序(简单的复数计算器)中 - 这种方法不起作用。经过谷歌搜索并找出原因后,我最终得到了这段代码:

Header:

struct Complex {
        double Re;
        double Im;

        Complex (double R, double I) : Re(R), Im(I) { }

        Complex operator + (Complex &Number);
        //more overloads
    };

Source:

Complex Complex::operator + (Complex &Number)
    {
        Complex tmp = Complex(0, 0);
        tmp.Re = Re + Number.Re;
        tmp.Im = Im + Number.Im;
        return tmp;
    }

它现在可以工作了,但我想知道,为什么在第一段代码中我被允许放入两个参数operator超载,但在第二个超载时出现以下错误?

complex.cpp:5:51: error: 'Complex Complex::operator+(Complex, Complex)' must take either zero or one argument

无论我是否使用类,情况都是一样的。我一直在寻找许多文档,第二种方法似乎更正确。也许是因为参数类型不同?

两个源均编译为-Wall -pedantic参数使用g++,两者都使用相同的库。


假设你有一个这样的类:

class Element {
public:
    Element(int value) : value(value) {}
    int getValue() const { return value; }
private:
    int value;
};

有四种方法可以定义二元运算符,例如+.

  1. 作为一项免费功能,只能访问public班级成员:

    // Left operand is 'a'; right is 'b'.
    Element operator+(const Element& a, const Element& b) {
        return Element(a.getValue() + b.getValue());
    }
    

    e1 + e2 == operator+(e1, e2)

  2. 作为成员函数,可以访问类的所有成员:

    class Element {
    public:
        // Left operand is 'this'; right is 'other'.
        Element operator+(const Element& other) const {
            return Element(value + other.value);
        }
        // ...
    };
    

    e1 + e2 == e1.operator+(e2)

  3. As a friend函数,可以访问类的所有成员:

    class Element {
    public:
        // Left operand is 'a'; right is 'b'.
        friend Element operator+(const Element& a, const Element& b) {
            return a.value + b.value;
        }
        // ...
    };
    

    e1 + e2 == operator+(e1, e2)

  4. As a friend在类体外部定义的函数——行为与 #3 相同:

    class Element {
    public:
        friend Element operator+(const Element&, const Element&);
        // ...
    };
    
    Element operator+(const Element& a, const Element& b) {
        return a.value + b.value;
    }
    

    e1 + e2 == operator+(e1, e2)

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

C++ 中运算符重载中的参数数量 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 删除索引后是否应该重新编译表?

    我正在删除一些未使用的索引 我通常做的是 确保统计信息已更新 也许索引尚未使用 因为统计信息已经有一段时间没有更新了 为每个涉及的索引生成删除索引脚本和创建索引脚本 运行删除索引命令 update statistics tablename
  • Python VS Code 导入不起作用“无模块名称请求”

    我是 python 新手 刚学了 6 个月的 c 也是 VS Code 来自 VS 的新手 我的错误是 gt 发生异常 ModuleNotFoundError 没有名为 requests 的模块 文件 C Users ryanb Docum
  • Swift 中的 AES128 加密

    我对 AES 128 加密有疑问 iOS 中的加密字符串与 Android 中的加密字符串不同 下面是安卓代码 public class Encryption private static final String ALGORITHM AE
  • CardLayout 显示下一个面板 - java Swing

    我在使用 CardLayout 时遇到一些问题 我有一个面板和一个 下一步 按钮 单击它后我想显示第二个面板 在我的代码中 当我单击 下一步 按钮时 不会显示下一个面板 有人可以帮我解决这个问题吗 package com test impo
  • 如何删除文件中除第一个匹配行之外的重复行

    在下面的配置文件中 etc fine tune conf 我们有重复的行 clean history in os true 我们要删除所有包含以下内容的行clean history in os true除了文件中的第一个匹配行 到目前为止我
  • Firebase 令牌过期和处理刷新令牌的最佳实践

    我目前正在客户端应用程序 基于 Cordova 的移动应用程序 上使用 Firebase 并使用客户端上的 firebase 用户身份验证方法 使用电子邮件和密码登录 FacebookAuthProvider 根据我目前对会议到期的理解和经
  • MSBuild 使用 ItemGroup 和 EXEC 命令

    我创建了代码片段中显示的 ItemGroup 我需要迭代此 ItemGroup 并运行 EXEC 命令 也在代码片段中显示 我似乎无法让它发挥作用 代码返回如下所示的错误 注意 消息被写入 2 次 这是正确的 但 EXEC 命令未正确运行
  • AWK - 是否可以按不同字段&&按小时细分日志文件

    Question 我想知道是否可以awk独自闯入 一个日志文件 然后有awk输出一条不同的消息 小时细分 00 23 以及该特定时间的计数 小时与不同的消息 Example 请求的输出 Message1 00 13 01 30 23 6 M
  • WPF .NET4.0 重用 UserControl 的相同实例

    我想显示用户控件的同一实例两次 我尝试过执行以下操作
  • Javascript 和 CSS 文件在 Maven 构建中组合,无需压缩、缩小等

    有没有一个 Maven 插件只结合了 js 和 css 资源 但不做任何缩小 混淆 压缩等操作 只是简单的资源串联 对您的项目进行以下更改 In your pom xml
  • 在linux中设置java_home和path环境变量[重复]

    这个问题在这里已经有答案了 我下载了 java 8 和 amd 组合包 以便在 Linux 中使用 Cassandra 当我运行 cassandra 时 它显示为 无法找到 java 可执行文件 检查JAVA HOME和PATH环境变量 如
  • 使用系统数据源而不是用户数据源作为 ODBC 连接字符串

    OdbcConnection DbConnection null try DbConnection new OdbcConnection Driver SQL Anywhere 10 Uid user pwd pass Dsn
  • 了解 Elixir 函数参数中的模式匹配

    在 Elixir in Action 一书中 其中一个示例的一个函数颠覆了我对模式匹配的理解 def add entry TodoList entries entries auto id auto id todo list entry do
  • 从 BitBucket Rest API v2.0 获取文件

    我有一个脚本 它使用 bitbucket REST API 1 0 从 GIT 获取文件 但它最近停止工作 我推测这可能是由于 v1 REST API 被贬值所致 但我不确定 无论如何 我正在尝试使用新的 2 0 REST API 检索文件
  • 具有并行命令的 Jenkins 管道

    我有这个基本的詹金斯管道 注 我省略了subJobParams使代码更小 pipeline agent any stages stage stage1 steps script parallel mongoParallel build jo
  • 将日期从 Excel 文件转换为 pandas

    我正在导入Excel文件 其中 日期 列有不同的书写方式 Date 13 03 2017 13 03 2017 13 03 2017 13 03 2017 10 3 17 10 3 17 9 3 17 9 3 17 9 3 17 9 3 1
  • CSS在确定父级大小时忽略一个元素[重复]

    这个问题在这里已经有答案了 基本上 我怎样才能实现这一目标 div div class ignoreWidth style width 20px 20px div div style width 4px 4px div div style
  • 捕获除重置之外的所有事件

    我想捕获除 重置 之外的所有事件 我在视图中初始化了这样的代码 messagesCollection on all handleMessageChanges 现在它适用于所有事件 正如我上面提到的 我不需要捕获重置事件 我该如何解决这个问题
  • UIPanGestureRecognizer 在 iOS 13 中无法工作

    我们在 iOS 12 中开发了一款应用程序 运行得非常好 现在 在 iOS 13 中 UIPanGestureRecognizer 不再工作 我已经寻找解决方案但没有找到任何东西 IBAction func handlePan recogn
  • C++ 中运算符重载中的参数数量

    我正在学习 C 并且创建了两个简单的 hello world 应用程序 在这两个例子中我都使用了运算符重载 但问题就在这里 对于第一个 我可以为重载运算符提供两个参数 这很好 Header enum Element a b c d e El