首页 > 编程语言 >C++友元和运算符重载

C++友元和运算符重载

时间:2023-09-29 12:23:15浏览次数:42  
标签:友元 temp Person C++ 运算符 Phone person 重载 class

友元

  • class buiding
    {
    friend void Goodboy(buiding*bui);
    public:
    int m_age;
    private:
    int m_size;
    };
    //全局函数
    void Goodboy(buiding*bui)
    {
    cout<<bui->m_age<<endl;//可以调用public中的m_age
    cout<<bui->m_size<<endl;//m_size调用需要声明友元
    }
  • 私有的部分要声明友元。

    友元类

    • 类外写成员函数

    • class Phone;//类的声明
      class Person
      {
      public:
      Person();
      void visit();
      private:
      Phone*phone;
      };
      class Phone
      {
      friend class Person;
      public:
      Phone();
      private:
      string m_name;
      };
      Phone::Phone()
      {
      this->m_name="小民";
      }
      Person::Person()
      {
      phone=new Phone;//地址相同,用于连接phone类
      }
      void Person::visit()//在类person中调用phone中的私有类
      {
      cout<<phone->m_name;
      }
      int main()
       Person p;
       p.visit();

       

    • 成员函数做友元

    • friend void Phone::visit();
  • 运算符重载

  • 加法

  • 全局函数重载,在类和main函数中间进行实现。

  • Person operator+(person&p1,person&p2)
    {
    Person temp;
    temp.m_a=p1.m_a+p2.m_a;
    temp.m_b=p1.m_b+p2.m_b;
    return temp;
    }

     

  • 成员函数重载

  • person operator+(person&p)
    {
    person temp;
    temp.m_a=this->m_a+p.m_a;
    temp.m_b=this->m_b+p.m_b;
    return temp;
    }

     

  • 左移运算符重载

  • 左移运算符重载只能用全局函数进行重载,因为成员函数在调用时会使cout在方法的右边。例如:p.text()=cout

  • class person
    {
    public:
    int age;
    int age2;
    };
    ostream &operator<<(ostream&out,perspm&p)//ostream是cout的数据类型,ostream作为返回的作用是作为链式输出。
    {
    out<<p.age<<p.age2<<endl;
    return out;
    }
    ​

     

    自增运算符重载

  • #include <iostream>
    using namespace std;
    class Person
    {
    friend ostream&operator<<(ostream&cout,Person&p);//对左移运算符进行重载
    public:
      Person ()
      {
       m_age = 0;
      }
      //前置递增
    /* Person&operator++()//实现++的时候用引用的形式进行返回,能对++后的值返回在进行++;
      {
           m_age++;
          return *this;
      }
      */
      //后置递增
      Person operator++(int)//不能用引用,引用无需复制一份内存。而局部变量temp的调用后释放无法加加,为与前置递增区分开来用占位符来区分。
      {
         Person temp=*this;
         m_age++;
         return temp;
      }
    private:
      int m_age;
    };
    ​
    ostream & operator<< (ostream & cout, Person & p)//进行左移运算符调出m_a;
    {
      cout << p.m_age << endl;
      return cout;//实现链式输出,将++后的值返回给Person中
    }
    /*
    void test()
    {
       Person p;
       ++p;
       cout<<p<<endl;
    }
    */
    void test01()
    {
       Person p;
       p++;
       cout<<endl;
    }
    int
    main ()
    {
    test();
    test01();
    return 0;
    }
    ​

     

标签:友元,temp,Person,C++,运算符,Phone,person,重载,class
From: https://www.cnblogs.com/boyboy/p/17736893.html

相关文章

  • 结对项目:用C++实现四则运算
    软工作业3:自动生成小学四则运算题目的命令行程序这个作业属于哪个课程计科21级12班这个作业要求在哪里结对项目这个作业的目标熟悉合作开发流程项目Github点击这里团队成员姓名学号石云欣3221004809沈纪康3121004750PSP表PSP2.......
  • C++内存模型
    目录C++内存模型存储持续性内存分配位置链接性作用域对于函数C++内存模型存储持续性C++存储持续性有以下类别:自动存储持续性:在函数定义中声明的变量(包括函数参数)。静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量。线程存储持续性(C++11):使用关键字thread......
  • JAVA代码使用JNI的方式调用C/C++动态库
    JNI(javanativeinterface),通过JNI的方式调用动态库步骤比较麻烦,不用额外引入依赖,对java项目工程依赖侵入为0,类中含有native描述的方法都会与动态库去一一映射,能通过System.load()函数去加载动态库,这种方式主要使用的场景是java写好类(一般不是接口),让C或者C++去实现......
  • C++原子变量atomic详解
    b站视频文章1C++中原子变量确保共享变量的操作在执行时不会被其他线程的操作干扰。无法复制/移动对象。is_lock_free函数:atomic对象是否支持无锁操作(什么意思?如果atomic对象需要锁,那设为atomic对象的意义是什么?)std::atomic_flag是C++中的一个原子布尔类型,它用于实现原子锁......
  • Effective Modern C++
     作者针对C++11/14而写的 EffectiveModernC++简介-EffectiveModernC++(cntransgroup.github.io)  一篇文章学完EffectiveModernC++:条款&实践-知乎(zhihu.com) ......
  • 每一个C++开发者都应该知道的线上工具
      每一个C++开发者都应该知道的线上工具-知乎(zhihu.com) 要想代码写得丝滑,怎么可以不熟练各种开发工具呢?锤子用的好,烦恼会减少。这里推荐几个C++开发中用于编译、构建、调试和性能分析的线上工具,最初的资料来源于LightningTalk:OnlineToolsEveryC++DevelopersSh......
  • C++(命名空间,输入输出)
    从堆上申请空间#include<malloc.h>int*p=(int)malloc(10sizeof(int));//malloc返回的是无类型free(p);//释放内存,不然会造成内存泄漏命名空间:用户自己定义的作用域namespaceN{//变量inta;//函数}inta;//不冲突命名空间可以嵌套在一个工程中,可以出现多个相同名称的命名......
  • .NET Core|--调用C++库|--LibraryImport docker环境下,处理依赖问题--GCC--Docker
    前言万恶之源在于,C#程序中需要调用C++的一个函数库,在Windows环境下,只要保证引用的相关dll存在,就是ok的,但是在Linux环境下,并且我的Webapi程序是部署在docker中的,问题就比较麻烦一些.经历了新建软链接,缺失".so"文件,有了".so"文件后,版本错误:libstdc++.so.......
  • c++正则表达式汇总
    一、校验字符的表达式1汉字:^[\u4e00-\u9fa5]{0,}$2英文和数字:^[A-Za-z0-9]+或[A−Za−z0−9]4,403长度为3-20的所有字符:^.{3,20}$4由26个英文字母组成的字符串:^[A-Za-z]+$5由26个大写英文字母组成的字符串:^[A-Z]+$6由26个小写英文字母组成的字符串:^[a-z]+$7由数字......
  • C++多线程Multithreading std::condition_variable
    多线程Multithreading#include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::mutexmtx;std::condition_variablecv;boolisOdd=true;voidprintOdd(){for(inti=1;i<=100;i+=2){......