zoukankan      html  css  js  c++  java
  • C++之------运算符重载

    ①  什么是运算符重载?


         何为C++的运算符重载呢?

    其实就是运算符给它重新赋予新的含义或者多重含义。让它有另外一种新的功能。

         为什么需要运算符重载?

    面向对象中为了实现类的多态性,我们就引用了运算符重载

    程序中可以利用“+”、“—” 对整数、单精度、双精度以及指针进行加法和减法运算等

    例如:

    1 int a = 1+2; //对整数加
    2 double d = 1.0+2.54; //对双精度加
    3 int por[10];
    4 int *p = por;
    5 p = p- 1; //对指针减1

    ②运算符重载由来


              在计算机的内存中,整数与浮点数的存储形式是不一样的,计算机他们的加减运算的处理过程是不同的,

    而且指针-1并不是简单的地址-1而已。在C++里面,编译器来处理这些问题,它可以根据表达式两侧的类型来决

    定应该如何处理他们的运算,最后决定该执行什么操作。所以在C++中可以对运算符可以对不同类型进行运算操作。    

        现实中的问题:复数的运算-------

           可能很多童鞋忘了什么是复数.咋们先来说说什么是复数(光谷的学到老活到老)

        复数是指能写成如下形式的数a+bi,这里a和b是实数,i是虚数单位。在复数a+bi中,a称为复数的实部,b称

    为复数的虚部,i称为虚数单位。当虚部等于零时,这个复数就是实数;当虚部不等于零时,这个复数称为虚数,复数的

    实部如果等于零,则称为纯虚数。由上可知,复数集包含了实数集,并且是实数集的扩张。 复数是由意大利米兰学者

    卡当在十六世纪首次引入,经过达朗贝尔、棣莫弗、欧拉、高斯等人的工作,此概念逐渐为数学家所接受。(来自:百度百科)

    好,来正题:

    比如两个复数:S1=(1+2i)  S2=(6+1.2i)

    我们在数学里面进行两个复数相加S=S1+S2=(7+3.2i)  (实部与实部相加,虚部与虚部相加)

    在C++里面我们如何计算呢 ?

    所有我们需要用到运算符的重载。 

    ③  程序中运算符重载格式


    重载的运算符函数语法为:

    重载运算符的函数一般格式如下:
        <返回值类型># operator 运算符名称 (形参表列)
        {
            // 对运算符的重载处理
        }

     operator为关键字,专门用于定义重载的运算符函数,#代表要被重载的运算符。如:

    Complex operator + (const Complex& a, const Complex& b){ ...... } 该函数可以用来是是实现对两个Complex对象的加,

     

    比喻下面的例子

     1 int main(){
     2     Complex a(10, 7), b(3, 5);
     3     Complex c= a + b;
     4     Complex d = a - b;
     5     Complex e = a + b - d; 
     6     cout << "c="; c.print_complex();
     7     cout << "d="; d.print_complex();
     8     cout << "e="; e.print_complex();
     9     int x=100, y=200, z;
    10     z = x + y;
    11     cout <<  "z=" << z;
    12 }

    使用成员函数来重载Complex的+、-运算符操作

     1 #include <iostream>
     2 using namespace std;
     3 class Complex {
     4 private:
     5     double rpart, ipart;
     6 public:
     7     Complex ( ) { rpart=ipart=0.0; }
     8     Complex(double rp, double ip){
     9         rpart=rp; ipart=ip;
    10     }
    11     Complex operator +(const Complex &c){
    12         Complex temp(rpart+c.rpart, ipart+c.ipart);
    13         return temp;
    14     }
    15     
    16     Complex operator -(const Complex &c);
    17     void print_complex()
    18     {
    19         cout<< "(" << rpart<<','<<ipart << "i)" <<endl;
    20     }
    21 };
    22 //类外实现operator –函数
    23 Complex Complex::operator -(const Complex &c){
    24     Complex temp(rpart-c.rpart, ipart-c.ipart);
    25     return temp;
    26 }

    运行结果:

    C++编译器的处理为(a.operator +(b)).operator –(d)  

    ③哪些运算符可以重载?


          运算符的重载有哪些呢?

                                                                                        可以被重载的运算符

    单目运算符

    +(正)、-(负)、*(指针)、&(取地址)

    双目算术运算符    

    +(加)、-(减)、*(乘)、/(除)、%(取摸)

    自增自减运算符    

    ++(自增)、--(自减)

    逻辑运算符

    ||(逻辑或)、&&(逻辑与)、!(逻辑非)  

     
    关系运算符  

    = =(等于)、!=(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)  

    位运算符    

    |(按位或)、&(按位与)、~(按位取反)、^(按位异或)、<<(左移)、>>(右移)

    赋值运算符  

    =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

    内存申请与释放  

    new、delete[]、new[]、delete[]

    其他运算符  ()(函数调用)、->(成员访问)、->*(成员指针访问)、,(逗号)、[](下标)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    类成员访问运算符:->     

    看看网上的一个例子:

     1 #include <iostream>
     2 using namespace std;
     3 class A{
     4 public:
     5     A(double v){
     6         value = v;
     7     }
     8     print(){
     9         cout << value;
    10     }
    11 private:
    12     double value;
    13 };
    14 class A_Ptr{
    15 public:
    16     A_Ptr(A* p){
    17         pa = p;
    18     }
    19     A* operator ->(){
    20         return pa;
    21     }
    22 private:
    23     A* pa;
    24 };

    这里我们直接编译器测试输出结果:

    理解: A_Ptr类封装了类A对象,语句“aptr->print();”中的“aptr->”部分,编译器调用“A *aptr.operator ->();”,

    返回一个指向类A的对象的指针。然后调用该指针所指向对象的print函数。即调用过程为: (aptr.operator ->())->print();

     

    END!

     

    马上快过中秋节了,公司放了三天,没有妹纸,出去玩没意思,那就好好补下知识。

    也提前祝大家中秋节快乐,幸福安康! 

    本人屌丝一个,没钱送月饼大家,送我一美女同事照片给大家养养眼。夏天酷热难耐,愿美女给大家带来一丝清凉感。

     

      
     
            夏天炎热,不要湿身哦
     
     
     
     
     
     
         最近的一件新闻大家注意一下:一手游公司程序员,加班挂掉,才25岁。!!!
      还是那件事:程序员晚上要少撸代码多休息。所有健康很重要哦。今天还专门炖了一大电饭煲鸡蛋排骨汤吃来补身子。洗澡休息吧。
    欢迎大家一起交流 ,分享程序员励志故事。   幸福的程序员 QQ群:幸福的程序员  

     

     

  • 相关阅读:
    浏览器能正常访问的url,superagent不能正常访问
    Reactor模式理解
    牛客网剑指offer 二维数组的查找
    在C语言结构体中添加成员函数
    html页面字体相关
    html页面背景设定相关
    快速排序
    html页面边框的另一种写法
    2018暑期北航软件能力培养师资培训有感
    web.xml文件介绍
  • 原文地址:https://www.cnblogs.com/1hua1ye/p/3959850.html
Copyright © 2011-2022 走看看