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

这篇具有很好参考价值的文章主要介绍了运算符重载的函数作为类的成员函数和友元函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   文章来源地址https://www.toymoban.com/news/detail-478346.html

到了这里,关于运算符重载的函数作为类的成员函数和友元函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】构造函数,析构函数,拷贝构造,运算符重载,const 成员

    默认成员函数:如果不显示,编译器默认生成 构造函数:是一个特殊的 成员函数 ,函数名与类名相同,专门用于 初始化类对象 函数名与类名相同 无返回值 ,没有被声明为void类型 对象实例化时 编译器自动调用 , Date d1 ,或 Date d2(2023, 4, 21) 构造函数可以重载,一个类中可以

    2023年04月24日
    浏览(69)
  • 【C++深入浅出】类和对象中篇(六种默认成员函数、运算符重载)

    目录 一. 前言  二. 默认成员函数 三. 构造函数 3.1 概念 3.2 特性 四. 析构函数 4.1 概念 4.2 特性 五. 拷贝构造函数 5.1 概念 5.2 特性 六. 运算符重载 6.1 引入 6.2 概念 6.3 注意事项 6.4 重载示例 6.5 赋值运算符重载 6.6 前置++和后置++运算符重载 七. const成员函数 7.1 问题引入 7.2 定义

    2024年02月09日
    浏览(64)
  • 【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

      拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) ,在用已存在的类类型对象创建新对象时由编译器自动调用。 1. 拷贝构造函数是 构造函数的一个重载形式 ; 2. 拷贝构造函数的 参数只有一个且必须是类类型对象的引用 ,使用传值方式编

    2024年02月03日
    浏览(46)
  • C++ 类和对象篇(八) const成员函数和取地址运算符重载

    目录 一、const成员函数 1. const成员函数是什么? 2. 为什么有const成员函数? 3. 什么时候需要使用const修饰成员函数?  二、取地址运算符重载 1. 为什么需要重载取地址运算符? 2. 默认取地址运算符重载函数 3. 默认const取地址运算符重载函数 4. 什么时候要显示重载取地址运算

    2024年02月07日
    浏览(58)
  • 【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

    🔑日期类的实现,将按以下声明依次进行,其中因为Print函数比较短,直接放到类里面让其变成内联函数 🔑而我们实现日期类经常要用到某月有多少天,在这里先把获得某月有多少天的函数实现出来。实现时先检查传参有没有问题,在注意把数组设置成静态的,出了作用域

    2024年02月08日
    浏览(66)
  • 【C++技能树】令常规运算符用在类上 --类的六个成员函数II

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 C++中为了增强代码的可读性,加入了运算符的重载,与其他函数重载一样。其命名格式如下: 返回值类型 operator操作符(参数列表) 但并不是所有运算符都可以重载的: 不可以自定

    2024年02月05日
    浏览(42)
  • [C++] 类与对象(中)类中六个默认成员函数(2)-- 运算符重载 -- 取地址及const取地址操作符重载

      本篇我们以日期类来展开讲。对于一个日期,我们如何去比大小呢?对年月日依次进行比较可以,但是可以直接比较吗? 我们可以看到,对于自定义类型的日期类直接去比较两个日期的大小是错误的,因此我们需要对运算符赋予特殊的功能,去实现可以对自定义类型的比较

    2024年02月13日
    浏览(53)
  • 【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

    list使用文章 析构函数   在定义了一个类模板list时。我们让该类模板包含了一个内部结构体_list_node,用于表示链表的节点。该结构体包含了指向前一个节点和后一个节点的指针以及节点的值。在list中保存了链表的头节点指针和链表长度大小。       因为list的底层实现

    2024年02月14日
    浏览(49)
  • C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|

    目录 日期类型  Date.h  Date.cpp  Test.cpp  实现Cout运算符重载  实现Cin运算符重载  根据日期算星期  修改后完整代码   Date.h  Date.cpp  const成员  取地址及const取地址操作符重载 习题  计算日期到天数转换     一个类到底可以重载哪些运算符,要看哪些运算符对这个类型有

    2023年04月13日
    浏览(58)
  • 【C++】类与对象(2补充运算符重载,const成员)

    作者:爱写代码的刚子 时间:2023.5.11 本篇作为【C++】类与对象(2)的补充(运算符重载、const成员) 赋值运算符重载 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包