zoukankan      html  css  js  c++  java
  • C++对运算符进行重载学习笔记

    1.  一个类的成员函数是暗含着 this 指针的,eg;

     1 #include<iostream>
     2 using namespace std;
     3 
     4 class A{
     5 public:
     6     A(){ x = 0;}
     7     double get_add(A &c);
     8 private:
     9     double x;
    10 };
    11 
    12 double A::get_add(A &c){
    13     A d;
    14     return d.x = x+c.x; //注意这里的 x+c.x;这个单独的 x 相当于 this->x 或者 (*this).x;
    15 }

    2. 将运算符重载函数作为类的友元函数和作为类的成员函数的区别:

        如果将运算符重载函数作为类的成员函数,它可以通过 this 指针自由地访问本类的数据成员,因此可以少写一个函数的参数。但是,必须要求运算表达式(如c1+c2)左侧第一个参数是一个类的对             象,而且欲运算符函数的类型相同。

    在进行运算符重载的时候,考虑到各方面的因素和程序员的习惯,以下仅供参考:

    (1) C++规定,赋值运算符=、下标运算符[ ] 、函数调用运算符() 、成员运算符 ->必须作为成员函数。

    (2)流插入<< 和 流提取运算符 >> 、类型转寒运算符不能定义为类的成员函数,只能作为友元函数。

    (3)一般将单目运算符和复合运算符(+= , -= , /= ,*= , &=, !=,`= ,%= ,>>= ,<<=)重载为成员函数。

    (4)一般将双目运算符重载为友元函数。

    运算符重载的声明方式:

    1.重载单目运算符:

    1.1 成员函数:

    类中声明: Complex  Complex::operator+(Complex &c2);   //一个参数,另一个是暗含的this指针。

    类外定义: Complex  Complex::operator+(Complex &c2){};

    1.2 友元函数:

    类中声明:friend  Complex  operator+(Complex &C1,Complex &c2);  //注意有两个参数了

    类外定义:Complex  operator+(Complex &C1,Complex &c2){};

    2.重载双目运算符 “==”   “>”  “<”  

    类中声明:friend  bool  operator==(Complex &c1,Complex &c2);

    类外定义:bool  operator==(Complex &c1,Complex &c2){};

    大于和小于的情况只需要把“==”替换一下就行。

    3. 重载单目运算符 "++"  "--":

      由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可以省略此参数。

      C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。

      贴个代码吧,练练手。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 class Time{
     5 public:
     6     Time(){minute = 0;sec = 0;}
     7     Time(int m,int s):minute(m),sec(s){}
     8     Time operator++();
     9     Time operator++(int);
    10     void display(){cout<<minute<<":"<<sec<<endl;}
    11 private:
    12     int minute;
    13     int sec;
    14 };
    15 
    16 Time Time::operator++()    //定义前置自增运算符"++"重载函数
    17 {
    18     if(++sec>=60)
    19     {
    20         sec -= 60;
    21         ++minute;
    22     }
    23     return *this;  //返回自增加后的当前对象;
    24 }
    25 
    26 Time Time::operator++(int)   //定义后置自增运算符"++"重载函数
    27 {
    28     Time temp(*this);  //创建临时对象temp;
    29     sec++;
    30     if(sec>=60)
    31     {
    32         sec -= 60;
    33         ++minute;
    34     }
    35     return temp;    //返回的是自增前的对象;
    36 }
    37 
    38 int main()
    39 {
    40     Time time1(34,59),time2;
    41     cout<<"time:";
    42     time1.display();
    43     ++time1;
    44     cout<<"++time1:";
    45     time1.display();
    46     time2 = time1++;
    47     cout<<"time++";
    48     time1.display();
    49     cout<<"time2:";
    50     time2.display();
    51     return 0;
    52 }
    53 /*
    54 运行结果:
    55 time:34:59
    56 ++time1:35:0
    57 time++35:1
    58 time2:35:0
    59 */
    View Code

    程序分析:重载后置资政运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用,在定义函数时也不必使用此参数,因此可省写参数名,只须在括号中写int即可。

    4. 重载流插入运算符和流提取运算符:

    形式:

    istream & operator>>(istream  &,自定义类  &);

    ostream & operator<<(ostream  &,自定义类  &);

  • 相关阅读:
    mysql 存中文乱码
    解决办法:Message: 对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾
    windows无法安装到这个磁盘选中的磁盘具有MBR分区表解决办法
    Windows快速添加开机启动项
    使用markdown做本地笔记软件/编辑器
    Apache负载均衡配置
    setuptools包的使用
    Git clone报错Someone Could Be Eavesdropping On You Right Now (Man-In-The-Middle Attack)!
    Code Review 的项目
    Pytorch 之Torch
  • 原文地址:https://www.cnblogs.com/cypblogs/p/10046587.html
Copyright © 2011-2022 走看看