运算符重载使用成员函数方法和友元函数方法是否都可以?并且是没有区别的吗
1个回答
关注
展开全部
1.首先我们看一看函数重载,它旨在用同名函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载是将重载的概念扩展到运算符上。当运算符重载为类的成员函数时,函数的参数个数比原来的少一,因为第一个参数默认为this指针隐式传递。
Time operator+(Time &t);
等价于*this+t;
2.在提出友元函数前,我们会发现有时候第一个参数是非类对象时,重载为成员函数的重载并不适用了。重载友元函数没有隐退的参数this,,操作数都由参数来传递了,这样函数的参数就等同于运算符参数格数了。但是注意有一些并不能重载为友元函数:=,(),->.
第一步:将其原型放在类声明中,并且不要忘记关键字friend.
friend Time operator*(double m,const Time &t);
注意:它不是成员函数,但它与成员函数有相同的访问权限。比如可以访问类对象的私有部分。
第二步:函数定义的编写,因为它不是成员函数,所以不要用class::限定符。也不要在定义中使用关键字friend。
举例常见的友元:重载<<运算符
使用输出操作时,我们知道第一个操作是cout,ostream的一个对象。接下来才是类成员。那么我们必须使用友元函数。
————————————————
版权声明:本文为CSDN博主「sinat_21832749」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_21832749/article/details/47866305
咨询记录 · 回答于2022-01-11
运算符重载使用成员函数方法和友元函数方法是否都可以?并且是没有区别的吗
亲,您好,我是您的咨询老师,很荣幸为您解答问题,您的问题我已经看到了,正在整理答案,请稍等一会儿哦~
友元函数成员函数运算符重载功能上没有区别,有时将二元运算符重载成友元函数比成员函数更里灵活,例如:c2(复数)等于1(int)+c1(复数)c2 = 1 + c1;如果用“+”成员函数重载,编译会报错编译器会将右边式子解释为1.operator + (c2);1是int型数据不能进行“.”操作,用友元函数重载就不会出现这个问题operator + (1,c1)
我问的是方法,不是功能
1.首先我们看一看函数重载,它旨在用同名函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载是将重载的概念扩展到运算符上。当运算符重载为类的成员函数时,函数的参数个数比原来的少一,因为第一个参数默认为this指针隐式传递。Time operator+(Time &t);等价于*this+t;2.在提出友元函数前,我们会发现有时候第一个参数是非类对象时,重载为成员函数的重载并不适用了。重载友元函数没有隐退的参数this,,操作数都由参数来传递了,这样函数的参数就等同于运算符参数格数了。但是注意有一些并不能重载为友元函数:=,(),->.第一步:将其原型放在类声明中,并且不要忘记关键字friend.friend Time operator*(double m,const Time &t);注意:它不是成员函数,但它与成员函数有相同的访问权限。比如可以访问类对象的私有部分。第二步:函数定义的编写,因为它不是成员函数,所以不要用class::限定符。也不要在定义中使用关键字friend。举例常见的友元:重载<<运算符使用输出操作时,我们知道第一个操作是cout,ostream的一个对象。接下来才是类成员。那么我们必须使用友元函数。————————————————版权声明:本文为CSDN博主「sinat_21832749」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/sinat_21832749/article/details/47866305