// By using structure :
struct complex {
float real;
float imag;
};
complex operator+(complex, complex);
main() {
complex t1, t2, t3;
t3 = t1 + t2;
}
complex operator+(complex w, complex z) {
statement 1;
statement 2;
}
// By using class :
class complex {
int real;
int imag;
public:
complex operator+(complex c) {
statement 1;
statement 2;
}
main() {
complex t1, t2, t3;
t3 = t1 + t2;
}
在使用结构时,重载函数可以接受两个参数,而在使用类时,重载函数只接受一个参数,当重载运算符函数在两种情况下都是成员函数时,即在struct和class中。为什么会这样?
答案 0 :(得分:10)
这与类和结构无关。这是关于成员与非成员。
C ++中的类和结构区别仅仅是成员和基础的默认可访问性级别(对于结构体是公共的,对于类是私有的)。除此之外, 没有区别。
当重载运算符时,您几乎总是可以选择将运算符定义为成员或独立函数。只有4个运营商必须是会员。它们是:()
,[]
,->
和=
(至于原因,请参阅this question of mine)。其余的,选择是你的。
这个优秀的FAQ entry解释了(除其他事项外)如何在成员与非成员之间做出选择。
回答你的核心问题:如果是成员函数,第一个文章是*this
答案 1 :(得分:3)
...当重载的操作符函数是两者中的成员函数时 案件,即结构和阶级......
是什么让你这么说的?这不是真的。
如果您的示例中为struct
,则重载的运算符函数不成员。这就是它需要2个参数的原因。
所以,差异与结构与阶级问题完全无关。您在这些运算符中具有不同数量的参数的原因是第一个实现为非成员(因此具有两个显式参数),而第二个实现为成员(因此只有一个显式参数)。
答案 2 :(得分:0)
这是因为您使用不同的方法来定义运算符。当你使用struct时,你可以在struct之外定义它,但是当使用class时你可以在class中定义operator。
答案 3 :(得分:0)
如果要将两个args传递给重载的运算符+,则应创建该类的友元函数,然后将const complex& lhs, const complex& rhs
作为args传递。现在,您可以为operator+
提供两个参数。
当operator+
是该类的成员时,一个arg被隐式传递为this
指针。
答案 4 :(得分:-1)
//
complex operator +(cont complex& lhs, const complex& rhs)
{
...
}
main()
{
complex t1,t2,t3;
t3=t1+t2; // i.e. t3 = operator+(t1, t2);
}
//
class complex
{
int real,imag;
public:
complex operator +(const complex& rhs){}
};
main()
{
complex t1,t2,t3;
t3=t1+t2; // i.e. t3 = t1.operator+(t2);
}
答案 5 :(得分:-2)
在第二个例子中,重载运算符是类的成员函数,因此当调用此运算符时,它被称为第一个操作数的成员函数,因此第一个操作数被隐式地赋予成员的成员已调用函数(如果您愿意,可以使用this
指针。)