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  &,自定义类  &);

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/cypblogs/p/10046587.html
Copyright © 2011-2022 走看看