zoukankan      html  css  js  c++  java
  • C++:运算符重载函数

                      5.运算符重载

    5.1 在类外定义的运算符重载函数

    C++为运算符重载提供了一种方法,即在运行运算符重载时,必须定义一个运算符重载函数,
    其名字为operator,后随一个要重载的运算符。例如,要重载"+"号,应该写一个名字为operator
    的函数,其他的运算符也是如此。
    函数 功能
    operator+ 加法
    operator- 减法
    operator* 乘法
    operator< 小于

    因此,若要两个对象相加,需要先定义一个运算符重载函数operator+,例如:

    class Complex{
       public:
         double real,imag;
         Complex(double r=0;doubble i=0)
         {
          real = r;
          imag = i;
         } 
    }; 
     Complex operator+(Complex om1,Complex om2)
     {
       Complex temp;
       temp.real = om1.real+om2.real;
       temp.imag = om1.imag+om2.imag;
       return temp;
     }        

    这样,就可以方便使用语句:

     int main()
       {
         Complex com1(1.1,2.2),com2(3.3,4.4),total;
       //total = com1+com2;
       //total = operator+(com1,com2);
         return 0; 
       }
       //上述两个注释语句是等价的,显然前者更简单明了。

    //例5.1 两个Complex类对象相加的完整程序

    #include<iostream>
    using namespace std;
     class Complex{
       public:
         double real,imag;
         Complex(double r=0,double i=0)
         {
          real = r;
          imag = i;
         } 
    }; 
     Complex operator+(Complex om1,Complex om2)  //定义运算符+的重载函数 
     {
       Complex temp;
       temp.real = om1.real+om2.real;
       temp.imag = om1.imag+om2.imag;
       return temp;
     }
    int main(int argc, char** agrv)
    {
      Complex com1(1.1,2.2),com2(3.3,4.4),total1,total2;
      total1 = com1+com2;                  //调用运算符重载函数operator的第一种方式  
      cout<<"total1.real="<<total1.real<<","<<"total1.imag="<<total1.imag<<endl;
      total2 = operator+(com1,com2);     //调用运算符重载函数operator的第二种方式
      cout<<"total2.real="<<total2.real<<","<<"total2.imag="<<total2.imag<<endl;
      return 0; 
    }

    C++对运算符重载指定如下一些规则:

    (1)不允许重载的运算符有:
    .(成员访问运算符) .*(成员指针访问运算符) ::(作用域符) Sizeof(长度运算符) ?:(条件运算符)

    (2)不允许用户定义新的运算符作为重载运算符

    (3)重载的功能应当与原有的功能相类似(+就是实现加法,-就是实现减法)

    (4)重载不能改变运算符的操作对象(即操作数)。例如,"+"就是一个双目运算符(即只能代两个操作数),重载后仍为双目运算符,需要两个参数。


    (5)重载不能改变运算符原有的优先级。但是可以采用加"()"的办法进行强制转换。

    (6)重载不能改变运算符原有的结合特性.例如,乘除法运算符都是从左往右结合的.必要时,可以采用加"()"的办法

    (7)运算符重载函数的参数至少应有一个是类对象(或类对象的引用)。也就是说,运算符重载函数的参数不能全是C++的标准型(基本数据类型)。目的是:防止用户修改标准类型数据的运算符性质。 

    (8)运算符重载函数可以是普通函数,也可以是类的成员函数,还可以是类的友元函数。

    (9)一般而言,用于类对象的运算符必须重载,但是赋值运算符"="除外,不必用户进行重载,系统已经为每一个新声明的类重载了一个赋值运算符函数,它的作是逐个复制类的数据成员,可以直接用于对象之间的赋值,用户不必自己编写运算符重载函数。

  • 相关阅读:
    mybatis 之 占位符#{} 和 ${}
    mybatis的#{}占位符和${}拼接符的区别
    MyBatis 批量操作、集合遍历-foreach
    Oracle查看和修改连接数
    linux下启动关闭oracle
    kafka的OffsetOutOfRangeError
    redis批量删除key
    mysql连接慢,修改配置文件
    [linux] ping服务器脚本
    oracle游标
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912482.html
Copyright © 2011-2022 走看看