• 第十一章 运算符重载


    第十一章 运算符重载

    1.  运算符重载

    2.  在成员函数中实现自加

    3.  重载前置自加运算符

    返回类型 operator@(参数表){}

    @代表要重载的运算符

    对象运算符重载不同于变量运算符重载

    void operator++(){++n;}

    ++i;//等价于i.operator++();若i是变量 则++i就是调用operator++()

    //n=++i;错误原因:右值为一个无符号的返回型

    //1+2;等价于operator+(1+2),此时

    4.  创建临时对象

    见程序

    5.  创建无名临时对象

    返回含参构造函数

    6.  取消创建临时对象

    返回*this

    7.  重载后置自加运算符

    8.  重载加法运算函数operator+

    11.  重载赋值运算函数operator=

    10.  转换类型运算符

    我们可以调用构造函数进行类型转换将一个变量赋给一个对象,但是反过来就不可以。(如果没有重载)

    11.  重载限定

    "."  "::"  "*"  "?:"  "#"   c++运算符除了这些不能被重载其他的都能被重载  

    “.”成员选择运算符

    “::”作用域限定运算符

    “*”指针运算符

    本章总结:

      1 /**
      2 成员数据为指针时 operator重载函数的定义
      3 注意:当成员函数 不是常用变量 就要重新定义 运算符重载函数
      4 */
      5 
      6 
      7 #include<iostream>
      8 using namespace std;
      9 class A
     10 {
     11 public:
     12     A(){n=new int;cout<<"执行无参构造函数
    ";}
     13     A(int i){n=new int;*n=i;cout<<"执行有参构造函数
    ";}
     14     A(A &r){n=new int;*n=*r.n;cout<<"执行复制构造函数
    ";}        //两块不同空间里的值相互复制
     15     ~A(){delete n;n=NULL;cout<<"执行析构函数
    ";}
     16     int get(){return *n;}
     17     void set(int x){*n=x;}
     18 
     19     //A &operator++(){++n;return *this;}
     20     A &operator++(){++(*n);return *this;}//前置自加//this是全局变量按别名返回可以避免调用复制构造函数
     21 
     22     //A operator++(int o){A temp(n);++n;return temp;}
     23     A operator++(int o){A temp(*n);++(*n);return temp;}//后置自加//这个要调用复制构造函数
     24 
     25     //A operator+(A &r){return A(n+r.n);}
     26     A operator+(A &r){return A(*n+*r.n);}//object1.operator+(object2)不会调用复制构造函数,只会调用构造函数创建一个临时的对象
     27 
     28     //A operator-(A &r){return A(n-r.n);}
     29     A operator-(A &r){return A(*n-(*(r.n)));}
     30 
     31     //A operator*(A &r){return A(n*r.n));}
     32     A operator*(A &r){return A(*n*(*(r.n)));}
     33 
     34     //A operator/(A &r){return A(n/r.n);}
     35     A operator/(A &r){return A(*n/(*(r.n)));}
     36 
     37     A &operator=(A &r)
     38     {
     39         if(this==&r)
     40             return *this;        
     41         else
     42             *(this->n)=*(r.n);
     43         return *this;
     44     }
     45 private:
     46     int *n;        //指针就像一把万能钥匙,要想利用这把钥匙就必须要有对应的空间
     47 };
     48 int main()
     49 {
     50     A a(1);
     51     A b(3);
     52     A c(5);
     53     A x;
     54     ++a;//a.operator++()
     55     cout<<a.get()<<endl;
     56     x=a++;
     57     cout<<x.get()<<endl;
     58     cout<<a.get()<<endl;
     59     a=b+c;//a.operator=(b.operator+(c))//这里优化了,不再调用复制构造函数
     60     cout<<a.get()<<endl;
     61     a=b-c;
     62     cout<<a.get()<<endl;
     63     a=b*c;
     64     cout<<a.get()<<endl;
     65     a=b/c;
     66     cout<<a.get()<<endl;
     67 
     68     return 0;
     69 }
     70 
     71 
     72 
     73 
     74 ///**
     75 //利用operator进行类型转换
     76 //我们可以调用构造函数进行类型转换将一个变量赋给一个对象,但是反过来就不可以。(如果没有重载)
     77 //*/
     78 //
     79 //#include<iostream>
     80 //using namespace std;
     81 //class A
     82 //{
     83 //public:
     84 //    A(){cout<<"执行无参构造函数
    ";}
     85 //    A(double i){n=i;cout<<"执行含参构造函数
    ";}
     86 //    A(A &r){cout<<"执行复制构造函数
    ";}
     87 //    ~A(){cout<<"执行析构函数
    ";}
     88 //    int get(){return n;}
     89 //    void set(int x){n=x;}
     90 //    operator double(){return n;}//没有返回类型但可以有返回值;没有参数但可以传参
     91 //private:
     92 //    double n;
     93 //};
     94 //int main()
     95 //{
     96 //    A object1(9.9);
     97 //    cout<<double(object1)<<endl;//显示转换
     98 //    cout<<(object1)<<" "<<object1<<endl;//隐式转换
     99 //    double x;
    100 //    x=object1;
    101 //    cout<<x<<endl;//隐式转换
    102 //    return 0;
    103 //}
  • 相关阅读:
    Python 元组
    Python 字典
    Python 列表
    Python 数字(函数)
    Python 序列操作符与函数(字符串)
    JavaScript使用IEEE 标准进行二进制浮点运算,产生莫名错误
    网站用户体验要点(翻译理论)
    去掉checkbox边框的方法
    WPF数据模板样式选择器
    JS中年份问题的纠结!
  • 原文地址:https://www.cnblogs.com/zenseven/p/3735003.html
Copyright © 2020-2023  润新知