第十一章 运算符重载

第十一章 运算符重载

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 //}
原文地址:https://www.cnblogs.com/zenseven/p/3735003.html