> 文章列表 > 运算符重载的函数作为类的成员函数和友元函数

运算符重载的函数作为类的成员函数和友元函数

运算符重载的函数作为类的成员函数和友元函数

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,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

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸