gpt4 book ai didi

c++ - 二元运算符声明的“static”关键字

转载 作者:可可西里 更新时间:2023-11-01 17:53:04 27 4
gpt4 key购买 nike

在 C++ 中,当 LHS 是被声明的类时,二元运算符可以被一个或两个运算符覆盖。如果用两个参数声明,则必须是非成员函数。在此代码中,两个声明是相同的。

class MyClass
{
public:
MyClass operator+(const MyClass&);
}
MyClass operator+(const MyClass&, const MyClass&);

有没有理由不能将后者作为静态成员函数来完成?像这样

class MyClass
{
public:
static MyClass operator+(const MyClass&, const MyClass&);
}

这将使编写流输入/输出运算符更容易(我知道您可以使用 friend 来声明运算符)

最佳答案

逻辑是a+b可以解释为operator+(a,b)或者a.operator+(b),如果你眯着眼睛,每一个看起来都是合理的。前者找不到任何成员函数;后者可以找到静态的,但只会无用地将b传递给它们。静态的可以通过解释为 a.operator+(a,b) 来正确调用,但这会尝试将额外的参数传递给任何非静态成员(可能将一元 - 例如,转换为二进制文件)。它还会破坏允许对第一个参数进行转换的功能,因为它的(原始)类型会通过名称查找限制候选者。

有一种情况,operator+(a,b) 可以找到一个成员函数——当运算符本身出现在一个类(成员函数)中时。对此类名称的非限定查找会特别忽略类成员,因为它们(尽管它们是非静态的)会有错误的元数并且(经常)会针对错误的类型(隐藏 所有 非成员同一个运算符的功能!)。

关于c++ - 二元运算符声明的“static”关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506601/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com