c++的类(二)运算符重载

概念:运算符只能运算内置的数据类型,不能运算自定义的数据类型(类),所以赋予运算符一个新的意义(即重载运算符,调用函数)。

一、+重载

class Person

{

public:

           Person(int age)

           {

                  this->age = age;

            }

            int age;

};

void test()

{

        Person p1(10);

        Person p2(20);

        Person p3=p1+p2;  //自定义数据类型,运算符重载,调用函数

}

p3=p1+p2实现函数:(非重载)

1.全局函数:

Person add( const Person &p, const Person &q)

{

        Person res(p.age+q.age);

        return res;

}

调用时:p3= add(p1,p2);

2. Person类内的函数(public):

Person add( const Person &p)

{

        Person res(this.age+p.age);

        return res;

}

调用时:p3=p1.add(p2);

重载:(自动调用)

把add换成operator+

二、<<重载

cout<<p1;   //不能打印,原意是要打印p1.age

//重载调用operator<<(cout,p1);

//或者cout.operator<<(p1);

重载:

全局函数

//若此时age为private,则需要将函数声明为Person类的友元

void operator<<(iostream & cout, const Person &p)

{

           cout<<p.age;  //若要endl,则要把cout返回。

}

5399f74959a04ed0a1ade430aa59627c.jpg

三、自加自减重载

//有++p或p++

1.++p1重载;

//原意是p1. age++

//重载调用operator++(p1);

//或者p1. operator++();

Person& operator++()

{

          this->age =this->age+1;

          return *this;

}

cout << ++p << endl

2.p1++重载

//原意是返回原值输出cout,原值+1

//函数与++p1的区别在占位符

Person &operator++(int)

{

         Person tmp=*this;

        this->age=this->age+1;

         return tmp;

}

四、*和->重载

智能指针:new出来的空间随着函数结束释放掉

class Smartpointer

{

public:

           Smartpointer(Person *p)

           {

                     this->p=p;

           }

            ~Smartpointer()

           {

                     delete p;

           }

           

           Person *p;

};

产生重载

void test()

{

           Person *p=new Person(10);

           Smartpointer sp(p);  //引用智能指针对象sp

           cout<< p->age <<endl;

           cout<< sp->age <<endl;  //让sp->返回的是p,调用sp.operator->()

           cout<< (*sp).age <<endl; //让*sp返回的是*p,调用sp.operator*()

}

在Smartpointer类内定义重载函数

Person * operator->()

{

       return p;

}

Person& operator*()

{

        return *p;

}

//返回对象,引用(不会产生新对象)

//返回指针,指针

五、=重载

Person p1(10,"bob");

Person p2;      //无参构造

p2=p1;       //并非调用拷贝构造(旧对象初始化新对象,两者皆为旧对象),内置了一个person& operator=( Person &p);进行浅拷贝,若有内存管理,会发生错误,所以要重写为深拷贝

重写重载函数

person &operator=( Person &p)

{

         this->age= p.age;

         this->name = new char[strlen(p.name)+1];

         strcpy(this-name, p.name);

         return *this;

}

编译器为每个类提供了4个默认函数

  1. 无参构造
  2. 拷贝构造
  3. 析构
  4. operator=();

六、==、!=重载

Person p1(10);

Person p2(10);

if(p1==p2)    //发生重载,调用p1.operator==(p2)

     cout<< " p1==p2" <<endl;

if(p1!=p2)    //发生重载,调用p1.operator==(p2)

     cout<< " p1!=p2" <<endl;

在Person类内定义重载函数:

bool operator==(Person p)

{

        return this->age==p.age; 

}

!=号同理。

七、()重载

class Person

{

public:

           add(int a, int b)

           {

                  return a+b;

           }

}

void test()

{

        Person p;

        cout<< p.add(3,4) <<endl;

        cout<< p(3,4) <<endl;   // 发生重载p.operator()(3,4),即为函数对象(可以像函数调用一样的对象)

}

在Person类内定义重载函数:

int operator()(int a,int b)

{

       return a+b;

}

即可:

cout<< Person () (3,4)<< endl;   //Person()为匿名对象Person() (3,4)为函数匿名对象

八、总结

1af7dac28c8d4ce6bba5b115e3aca5c8.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值