运算符重载的函数作为类的成员函数和友元函数
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🌸运算符重载定义为类的成员函数
🌸运算符重载函数作为类的友元函数
🌸实现“+”,“-“的普通重载函数和友元重载函数
🌸单目运算符"++"和"--"的重载
🐰运算符重载的函数作为类的成员函数和友元函数
🌸运算符重载定义为类的成员函数
将运算符重载定义为类的成员函数的原型在内部声明格式:
class 类名 {...返回类型 operator 运算符(参数列表);... };
在类外定义运算符重载函数的格式:
返回类型 类名::operator 运算符(参数列表) {... }
🌸运算符重载函数作为类的友元函数
将运算符重载函数作为类的友元函数。它与用成员函数重载运算符的函数的不同在于,成员函数重载运算符的函数本身是类中的成员函数,而友元函数是独立于类外的普通函数。
将运算符重载函数定义为类的友元函数,其原型在类的内部声明格式如下:
class 类名 {...friend 返回类型 operator 运算符(参数列表);... };
在类外定义友元运算符重载函数的格式:
返回类型 operator 运算符(参数列表) {... }
与用成员函数定义的方法相比较,只是在类声明函数原型时前面多了一个关键字friend,表明这是一个友元运算符重载函数,只有声明为友元函数,才可以访问类的private成员;由于友元运算符重载函数不是该类的成员函数,所以在类外定义时不需要加上类名。
🌸实现“+”,“-“的普通重载函数和友元重载函数
#include<iostream> using namespace std; class A { public:A(double x=0,double y=0):a(x),b(y){;}void show(){cout<<"运算后的结果为:"<<endl;cout<<"("<<a<<","<<b<<")"<<endl;}A operator+(A& ptr);//运算符普通重载函数A operator-(A& ptr); // friend A operator+(A& pf,A& pc);//友元运算符重载函数 // friend A operator-(A& pf,A& pc); private:double a;double b; }; A A::operator+(A& ptr)//为什么ptr可以调用私有成员 {return A(a+ptr.a,b+ptr.b); } A A::operator-(A& ptr) {return A(a-ptr.a,b-ptr.b); } //A operator+(A& pf,A& pc) //{ // return A(pf.a+pc.a); //} //A operator-(A& pf,A& pc) //{ // return A(pf.a-pc.a,pf.b-pc.b); //} int main() {A a(1,0),b(0,1),c(1,0),d(0,1),ph;ph=a+b;ph.show();ph=a-b;ph.show();return 0; } 普通重载函数和友元重载函数的结果都是一样的 运算后的结果为: (1,1) 运算后的结果为: (1,-1)
大家可能会疑惑,运算符重载函数可以是类的成员函数,也可以是类的友元函数,是否可以既不是类的成员函数也不是类的友元函数,其实是可以的,但是很少会用到,原因是普通函数不能直接访问类的私有成员,由于友元的使用会破坏类的封装,因此从原则上说,要尽量将运算符重载为成员函数。有时为了方便理解,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。但是也有例外,C++规定,有的运算符(赋值运算符,下标运算符,函数调用运算符)必须重载为类的成员函数,有的运算符则不能重载为类的成员函数(插入运算符"<<"和流提取运算符">>"、类型转化运算符)。
🌸单目运算符"++"和"--"的重载
有两种形式:前置的++ --,后置的++ --
有两种方法:运算符重载的成员函数 运算符重载的友元函数
(1)运算符重载的成员函数:
(1)运算符重载的成员函数 #include<iostream> using namespace std; class A { public:A(int count=0):Count(count){;}void show(){cout<<"运算后结果为:"<<Count<<endl;}//前置++,--A operator++(){++Count;return *this;}A operator--(){--Count;return *this;}//后置++,--A operator++(int){A num=*this;++(*this);return num;}A operator--(int){A num=*this;--(*this);return num;} private:int Count; }; int main() {A a(100),b(100),c(100),d(100);(++a).show();(b++).show();(--c).show();(d--).show();return 0; } 结果为: 运算后结果为:101 运算后结果为:100 运算后结果为:99 运算后结果为:100
(2)运算符重载的友元函数:
(1)运算符重载的成员函数 #include<iostream> using namespace std; class A { public:A(int count=0):Count(count){;}void show(){cout<<"运算后结果为:"<<Count<<endl;}friend A operator++(A& ptr);friend A operator--(A& ptr);friend A operator++(A& ptr,int);friend A operator--(A& ptr,int); private:int Count; }; //前置++,-- A operator++(A& ptr) {++ptr.Count;return ptr; } A operator--(A& ptr) {--ptr.Count;return ptr; } //后置++,-- A operator++(A& ptr,int) {A num;num=ptr;++ptr.Count;return num; } A operator--(A& ptr,int) {A num;num=ptr;--ptr.Count;return num; }int main() {A a(100),b(100),c(100),d(100);(++a).show();(b++).show();(--c).show();(d--).show();return 0; } 结果: 运算后结果为:101 运算后结果为:100 运算后结果为:99 运算后结果为:100
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸