C++中的运算符重载

Operator Overloading in C++

本文关键字:重载 运算符 C++      更新时间:2023-10-16

我怀疑我们是否能做到以下几点。

假设我已经创建了类A的两个实例,即obj1obj2,并且类A具有成员函数show()

我可以使用以下内容吗?

(obj1+obj2).show()

如果是,如何?如果没有,为什么不可能?

是的,这是可能的,只需为A实现运算符+,并让它返回类型A:的类

#include <iostream>
class A
{
public:
    explicit A(int v) : value(v) {}
    void show() const { std::cout << value << 'n'; }
    int value;
};
A operator+(const A& lhs, const A& rhs)
{
    A result( lhs.value + rhs.value );
    return result;
}
int main()
{
    A a(1);
    A b(1);
    (a+b).show(); // prints 2!
    return 0;
}

如果重载+运算符,使其接受两个类型为A的参数,并生成一个具有名为show的方法的对象,则可以执行此操作。

是的,如果您重载了class A+运算符以返回class A的obect,则可以使用它。

如果obj1+obj2确实返回了一个具有show()函数成员的对象,那么是的,这是可能的。

如果不是,那就不是。

因此,它取决于这里使用的运算符+函数,这取决于obj1和obj2的两种类型。

obj1+obj2是一个具有类型的表达式,该类型是操作返回的对象的类型,与任何表达式一样。现在,一旦表达式被执行,就有了这个对象。但由于这里没有将其与名称关联(例如使用赋值),它是一个"临时",意味着它将在完整表达式的末尾被销毁。

因此,如果生成的临时对象的类型确实提供了show()函数,那么您可以像以前那样调用它。

如果它不提供show()函数,那么您正试图调用一个不存在的函数。

所以在任何情况下,编译器都会阻止你,这不会是一个运行时错误。

我会是你,我会设置一个最小的测试项目,只是为了遵循这些原则。

为+操作符编写一个操作符重载,并定义您想要的操作。

在+运算符的运算符重载中,只需根据您的用例更新您想要的逻辑,如添加单个成员变量或串联名称等

然后你可以调用那个新对象。Show()函数就像一个调用成员函数的对象。

取决于obj1+obj2的结果类型以及.show()是否为常量方法。

否!(obj1+obj2)的结果不是对象。您可能会超载"="和用途:

obj3 = obj1 + obj2;
obj3.show();