C++运算符重载总结



1、为什么要有运算符重载

对于基础类型运算符知道怎么计算,原因是编译器对于自定义类型不知道如何进行加减

所以编译器提供了一种机制,让用户自己去完成自定义类型的加减操作,这个机制就是运算符重载机制。其实该机制本身就是函数重写

 

C++怎么知道是编译器的+-还是重载后的+-呢?

编译器是通过类型来检测的。

运算符重载的语法形式:

1、运算符函数是一种特殊的成员函数或友员函数

2成员函数的语法形式为:

         类型 (函数返回类型)  类名(重载运算符类名)  :: operator  op ( 参数表 )

         {

               // 相对于该类定义的操作

         }

  一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符。

2、重载运算符的限制

可以重载的运算符

+       -        *       /       %      ^       &      |       ~

!        =       <       >       +=     -=      *=     /=     %

^=     &=    |=     <<     >>     >>=  <<=  ==     !=

<=     >=     &&   ||     ++     --       ->*           ->

[]      ()       new delete      new[]       delete[]

 

不能重载的运算符

.        ::       .*      ?:      sizeof

 

重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:

不改变运算符的优先级

不改变运算符的结合性

不改变运算符所需要的操作数

不能创建新的运算符

 

 

 

 

1、       用成员或友元函数两种方法重载运算符

  1. 运算符函数可以重载为类的成员函数或友员函数。

  2.  关键区别在于成员函数具有 this 指针,友员函数没有this指针

3 不管是成员函数还是友员函数重载,运算符的使用方法相同。

  1. 传递参数的方式不同,实现代码不同,应用场合也不同

 

class test

{

public :

    test(int _a, int _b)

    {

       a = _a;

       b = _b;

    }

    void print()

    {

       cout << "a:" << a << "," << "b:" << b << endl;

    }

    //成员函数重载,this指针可以省略

    test operator+(test&t2)

    {

       test tmp(a + t2.a, b + t2.b);

       return tmp;

    }

    //friend test operator+(test&t1, test&t2);//友元函数重载

protected:

private:

    int a;

    int b;

};

//test operator+(test&t1, test&t2)

//{

//  test tmp(t1.a + t2.a, t1.b+ t2.b);

//  return tmp;

//}

void  main()

{

    test t1(1,2);

    test t2(3, 4);

    test t3 = t1 + t2;

    t3.print();

    system("pause");

}

 

4、       一元运算符的重载:前置++--,后置++--

1、重载为成员函数,解释为:

Object . operator op ()

操作数由对象Object通过this指针隐含传递

2、重载为友员函数,解释为:

operator op (Object)

    操作数由参数表的参数Object提供

//通过成员函数完成前置--

         Test & operator--()

         {

                   this->a--;

                   this->b--;

                   return *this;

         }

         //通过成员函数完成前置--

         Test & operator++()

         {

                   this->a++;

                   this->b++;

                   return *this;

         }

 

         //通过类成员函数完成后置--

         Test  operator--(int)

         {

                   Complex tmp = *this;

                   this->a--;

                   this->b--;

                   return tmp;

         }

         //通过类成员函数完成后置--

         Test  operator++(int)

         {

                   Complex tmp = *this;

                   this->a++;

                   this->b++;

                   return tmp;

 

 

5、       二元运算符的重载+-*/

1、重载为成员函数,解释为:

ObjectL . operator op ( ObjectR )

左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递

2、重载为友员函数,解释为:

operator op ( ObjectL, ObjectR )

  左右操作数都由参数传递

 

//通过类成员函数完成-操作符重载

         Test operator-(Complex &c2)

         {

                   Complex tmp(a - c2.a, this->b - c2.b);

                   return tmp;

         }

         Test operator+(Complex &c2)

         {

                   Complex tmp(a + c2.a, this->b + c2.b);

                   return tmp;

         }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值