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

Posted ᰔᩚ. 一怀明月ꦿ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载的函数作为类的成员函数和友元函数相关的知识,希望对你有一定的参考价值。

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

❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」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

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

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

友员函数是指在类内说明()也可定义的一friend
说明的
其可以像成员函数一样访问类的各个成员但是其不属于类因此其不能用this访问列如
friend
void
sum(int
,int);友员函数没有this指针;其运算符重载
参考技术A 假设有个类a,如下语句:a
a;a
b=a;
这时候的复制运算符会起作用,而且是以成员函数被调用的,等价于b.operate=(a)。如果不是成员函数,那么不能这样使用。另外,必须重载说法是有问题的,只有类里面有指针成员的时候才需要重载
参考技术B 友元函数:具有与类成员函数相同访问权利的“非成员函数”,他可以访问类的私有和保护成员——通过该类对象、对象指针或其引用。
简单且一般的说:运算符重载为类的成员函数,他的参数个数会比“该运算符的操作符”少一,而运算符重载为友元函数时,他的参数与其操作个数是相同的。本回答被提问者采纳

以上是关于运算符重载的函数作为类的成员函数和友元函数的主要内容,如果未能解决你的问题,请参考以下文章

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

类和对象——补充(运算符重载,static和explicit关键字和友元,内部类)

什么是友元?为什么要引入友元?解释友元函数和友元类

对运算符重载和友元函数的例子

运算符重载和友元函数

运算符重载和友元