【问题标题】:How to define correctly unary operator- in C++如何在 C++ 中正确定义一元运算符
【发布时间】:2020-05-10 12:04:32
【问题描述】:

假设我们有这个类定义:

class A{
public:
    int a;
    A(int i): a(i){}
    A operator-() const { return A(- a); }     # first operator- function
};
A operator-(const A& o) { return A(- o.a); }   # second operator- function

现在,在main 函数中,如果我写:

A a1(10);
A a2 = -a1;                # Here the first operator- function (method) is called!

但是,如果我删除类中 operator- 的第一个定义,则会调用第二个函数。 我想知道为什么编译器在提供两者时更喜欢第一个定义。

我也想知道为什么编译器接受调用第一个函数(方法)。因为我认为该方法是 a1- 而不是 -a1 的同义词:应用该方法的对象位于运算符之前(左侧)。

【问题讨论】:

标签: c++ operator-overloading operator-keyword


【解决方案1】:

从 C++ standard 开始,一元减号运算符应如下定义:

T T::operator-() const;

在类定义中,像这样:

T operator-(const T &a);

在类定义之外。

现在,您的类中有两种定义类型,因此成员查找按指定的here 发挥作用:

执行两个单独的查找:对于非成员运算符 重载和成员运算符重载(对于运算符 两种形式都允许的情况下)。然后将这些集合与 如重载中所述,基于相同理由的内置运算符重载 解决。如果使用显式函数调用语法,则常规 执行非限定名称查找

所以,基本上,成员查找找到A operator-() const;,非成员查找找到A operator-(const A& o);。重载分辨率选择A operator-() const;

【讨论】:

    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多