zoukankan      html  css  js  c++  java
  • 03友元、运算符重载’

    锻炼类内声明,类外实现的写法---使用作用域符号::

    1)友元--friend--让一个函数或类访问另一个类中私有成员

        1)全局函数做友元

          在类中用friend声明全局函数是友元即可

        2)类做友元

          在类中用friend声明类是友元即可

        3)类中成员函数做友元

          在类中用friend声明类中成员函数是友元即可

    2)运算符重载--对已有的运算符重新进行定义,赋予其另一种功能,以适用不同的自定义数据类型---operator运算符

        1)加号+运算符重载--实现自定义数据类型相加运算

            成员函数--本质:类名 p3 = p1.operator+(p2)

            全局函数重载--本质:类名 p3 = operator+(p1,p2)

            运算符重载也可以发生函数重载

            内置数据类型不能改变运算方式

        2)左移<<运算符重载

            1)不会利用成员函数来重载<<运算符---因为无法实现cout在左侧

            2)只能利用全局函数来重载<<运算符

                -----cout输出流(ostream)对象--返回为输出流对象的引用(链式编程)

                -----

                  ostream& operator<< (ostream &cout, Person &p)

                {

                  cout << " m_A = " << p.m_A << "m_B" <<p.m_B;

                  return cout;

                } 

        3)递增++运算符重载

            1)前置++重载

              返回引用--可以链式编程

            2)后置++重载

              返回值

        4)赋值=运算符重载

     //重载 赋值运算符
        Person & operator=(Person &p)
        {
            //编译器提供的浅拷贝
            //m_Age = p.m_Age;
            //应先判断是否有属性在堆区,若有先释放干净,然后再深拷贝
            //1)释放内存
            if (m_Age != NULL)
            {
                delete m_Age;
                m_Age = NULL;
            }
            //2)深拷贝---重新申请一块内存空间
            m_Age = new int(*p.m_Age);
            //返回对象的本身---链式编程思想
            return *this;
        }

        5)关系==运算符重载

     //重载 ==
        bool operator==(Person& p)
        {
            if (this->m_Age == p.m_Age && this->m_Name == p.m_Name)
            {
                return true;
            }
            return false;

        }

        6)函数调用运算符重载 ----SPL中用的比较多---就是重载小括号()

            //由于使用起来很像函数调用,因此称为仿函数

            //仿函数非常灵活,没有固定的写法

    class Myprint
    {
    public:
        //重载函数调用运算符
        void operator()(string test)
        {
            cout << test << endl;
        }
    };


    void test3()
    {
        Myprint myprint;
        myprint("hello world");//由于使用起来很像函数调用,因此称为仿函数
    }

            //回顾匿名函数对象--类型+()==匿名对象(即没有名的对象---当前行执行完之后立马被释放)

  • 相关阅读:
    Structured streaming
    streaming窗口操作
    scala伴生对象,apply()及单例
    storm集成kafka
    solr简易安装配置
    拦路雨偏似雪花,饮泣的你冻吗?--稍瑞,我是关键字过滤器
    我存在,你深深的循环里--从反射看JSON死循环
    ueditor:原谅我这一生不羁放纵爱独特
    或许你不知道(2):LinkedList
    自定义负载均衡
  • 原文地址:https://www.cnblogs.com/MissZhang-154/p/13216401.html
Copyright © 2011-2022 走看看