C++友元和运算符重载

友元

  • 复制代码
    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;
    }
    ​
    复制代码

     

posted @   boyboy!  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示