gpt4 book ai didi

c++后缀/前缀运算符重载为非成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:46 29 4
gpt4 key购买 nike

我正在编写自己的数组类作为练习。因为,我读到非成员函数实际上在某些方面比成员函数更好。( Scott Meyers )

我正在尝试编写尽可能多的运算符重载作为非成员函数。运算符重载 + , - 作为非成员函数都可以正常工作。

my_array operator+(const my_array & left, const my_array & right);
my_array operator-(const my_array & operand);
my_array & operator++(); // prefix
my_array operator++(int); //postfix, compiler puts a 0

但是,作为非成员函数的前缀/后缀运算符会产生问题(如果我使用范围解析并使它们成为成员函数,它们可以正常工作)

我知道不是每个运算符重载都可以是成员函数。但是,我不知道为什么这两个不能是非成员函数。我得到的错误是:

: 'my_array& operator++()' must have an argument of class or enumerated type

如果我使它们成为成员函数并允许 *this 数组 obj 以以下格式传递,基本上可以解决这个问题。

(*this).operator++();

但整件事是,我首先不想让它们成为成员函数!那么,前/后修复运算符是否不能/不应作为非成员函数实现?

我想出的推理是,因为后缀/前缀是一元运算符他们只有一个参数(通常是 *this)。因此,如果我希望编译器隐式提供 *this 指针并调用重载,它们必须作为成员函数实现。

我的推理是否正确?如果不是,我如何将其实现为非成员函数?感谢您为我提供了一些见解。

最佳答案

也许我误解了,但如果您正在努力正确声明两个运算符,您仍然可以使用像成员这样的免费运算符来做到这一点。但是,您确实需要通过引用将对象 作为第一个参数传递。你是对的,作为成员函数,他们通过 this 免费获得他们的对象。免费功能,需要自己推送。

#include <iostream>

struct my_array
{
// your members here.
};

my_array& operator ++(my_array& obj)
{
// access to members is through obj.member
std::cout << "++obj called." << std::endl;
return obj;
}

my_array operator ++(my_array& obj, int)
{
my_array prev = obj;

// modify obj, but return the previous state.
std::cout << "obj++ called." << std::endl;

return prev;
}

int main(int argc, char *argv[])
{
my_array obj;
++obj;
obj++;
return 0;
}

输出

++obj called.
obj++ called.

关于c++后缀/前缀运算符重载为非成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789535/

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