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

    重载++和--

    设  A  Aobject ;

    运算符 ++和 - - 有两种方式:

    前置方式:   ++Aobject  --Aobject

    一元  成员函数  重载  A :: A operator++ () ;  

      解释为:  Aobject . operator ++( ) ;

              友元函数  重载  friend A operator++ (A &) ;

      解释为:   operator ++( Aobject ) ;  

    后置方式:  Aobject ++  Aobject

    二元  成员函数  重载  A :: A  operator++ (int) ;

      解释为:   Aobject . operator ++( 0 ) ;

              友元函数  重载:  friend A operator++ (A &, int) ;  

      解释为:   operator++(Aobject, 0) 

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //使用成员函数重载++运算符
     5 class Increase
     6 {
     7 public:
     8     Increase()
     9     {
    10         value =0;
    11     }
    12     void display();
    13     Increase operator ++();
    14     Increase operator ++(int);
    15 private:
    16     int value;
    17 };
    18 //前置
    19 Increase Increase::operator++()
    20 {
    21     value++;
    22     return *this;
    23 }
    24 //后置
    25 Increase Increase::operator++(int)
    26 {
    27     Increase temp;
    28     temp.value= value ++;
    29     return temp;
    30 }
    31 void Increase::display()
    32 {
    33     cout << value <<endl;
    34 }
    35 void main()
    36 {
    37     Increase a,b,c;
    38     int i;
    39     for(i=0;i<10;i++)
    40     {
    41         //用c调用前置++运算符
    42         a = c++;
    43     }
    44     cout << "c=" ;
    45     c.display();
    46     cout << "a=";
    47     a.display();
    48 
    49     for(i=0;i<10;i++)
    50     {
    51         //用c调用后置++运算符
    52         b = ++c;
    53     }
    54     cout << "c=" ;
    55     c.display();
    56     cout << "b=";
    57     b.display();
    58 }

    使用友元函数通过重载++运算符,实现和上面同样的效果

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //使用友元函数重载++运算符
     5 class Increase
     6 {
     7 public:
     8     Increase()
     9     {
    10         value =0;
    11     }
    12     void display()
    13     {
    14         cout << value << endl;
    15     }
    16     friend Increase operator++(Increase &i);
    17     friend Increase operator++(Increase &i,int);
    18 private:
    19     int value;
    20 };
    21 
    22 Increase operator ++(Increase &i)
    23 {
    24     i.value ++;
    25     return i;
    26 }
    27 Increase operator ++(Increase &i,int)
    28 {
    29     Increase temp;
    30     temp.value = i.value ++;
    31     return temp;
    32 }
    33 void main()
    34 {
    35     Increase a,b,c;
    36     for(int i=0;i<10;i++)
    37     {
    38         a = c++;
    39     }
    40     cout << "a=";
    41     a.display();
    42     cout << "c=";
    43     c.display();
    44 
    45     for(int i=0;i<10;i++)
    46     {
    47         b = ++c;
    48     }
    49     cout << "b=";
    50     b.display();
    51     cout << "c=";
    52     c.display();
    53 }
    “=”赋值运算符重载用于对象数据的复制
     operator= 必须重载为成员函数
    重载函数原型为:

      类名  &  类名  :: operator= ( 类名 ) ;

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 class Name
     6 {
     7 public:
     8     Name(char* name);
     9     Name(Name& name);
    10     Name operator =(Name& name);
    11     ~Name();
    12 private:
    13     int size;
    14     char* name;
    15 };
    16 
    17 //重载=运算符
    18 Name Name::operator=(Name& name)
    19 {
    20     cout << "重载=运算符	"<< name.name << endl;
    21     //删除当前name的值
    22     delete this->name;
    23     //为当前的name初始化指定的大小
    24     this->name = new char[strlen(name.name)+1];
    25     //如果参数name的内容不为空的话,将他的值赋值给当前name
    26     if(this->name!=0)
    27     {
    28         strcpy(this->name,name.name);
    29     } 
    30     //计算字符的大小
    31     size = strlen(name.name);
    32     //调用复制构造函数返回当前的this指针
    33     return *this;
    34 }
    35 
    36 //构造函数
    37 Name::Name(char* name)
    38 {
    39     cout << "constructing	" << name << endl;
    40     this->name = new char[strlen(name)+1];
    41     if(this->name!=0)
    42     {
    43         strcpy(this->name,name);
    44     }
    45     size = strlen(name);
    46 }
    47 //复制构造函数
    48 Name::Name(Name& name)
    49 {
    50     cout << "copying	 " << name.name << endl;
    51     this->name = new char[strlen(name.name)+1];
    52     if(this->name != 0)
    53     {
    54         strcpy(this->name,name.name);
    55     }
    56     size = strlen(name.name);
    57 }
    58 //析构函数
    59 Name::~Name()
    60 {
    61     cout << "distructing	" << this->name<<endl;;
    62     delete []name;
    63     size = 0;
    64 }
    65 void main()
    66 {
    67     Name n1("zhangsan");
    68     Name n2 = n1;
    69     Name n3 = ("lisi");
    70     n3 = n2 = n1;
    71 }

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

     1 #include <cstdlib>
     2 #include <iostream>
     3 using namespace std;
     4 class Vector
     5 {
     6 public:
     7     Vector(int size=1);
     8     ~Vector();
     9     int& operator[](int i);
    10     friend ostream& operator << (ostream& output,Vector& vector);
    11     friend istream& operator >> (istream& input,Vector& vector);
    12 private:
    13     int* v;
    14     int length;
    15 };
    16 Vector::Vector(int size)
    17 {
    18     if(size<=0||size>100)
    19     {
    20         cout << "The size of" << size << "is null!" << endl;
    21     }else
    22     {
    23         v = new int[size];
    24         length = size;
    25     }
    26 }
    27 Vector::~Vector()
    28 {
    29     cout << "析构
    ";
    30     delete []v;
    31     length = 0;
    32 }
    33 int& Vector::operator[](int i)
    34 {
    35     if(i>=0&&i<length)
    36     {
    37         return v[i];
    38     }else
    39     {
    40         cout << "The subscript" << i << "is outside!" << endl;
    41         exit(0);
    42     }
    43 }
    44 ostream& operator <<(ostream& output,Vector& vector)
    45 {
    46     for(int i = 0;i < vector.length; i ++)
    47     {
    48         output << vector[i] << " ";
    49     }
    50     output << endl;
    51     return output;
    52 }
    53 istream& operator >>(istream& input,Vector& vector)
    54 {
    55     for(int i=0;i<vector.length;i++)
    56     {
    57         input >> vector[i];
    58     }
    59     return input;
    60 }
    61 void main()
    62 {
    63     int k;
    64     cout << "Input the length of Vector a:" << endl;
    65     cin >> k;
    66     Vector a(k);
    67     cout <<"Input the elements of Vector a:" << endl;
    68     //调用重载版本
    69     cin >> a;
    70     cout << "Output the elements of Vector a:" << endl;
    71     //调用重载版本
    72     cout << a;
    73 }
  • 相关阅读:
    .NET牛人应该知道些什么
    秋梦
    感谢你走进我的生命里
    漂流有感
    QQ在跳舞
    青春无痕
    名人只是传说,你我才是传奇
    祝福紫秋
    可以用在任何人身上:百战百胜人生10大成功秘诀
    c#发送邮件
  • 原文地址:https://www.cnblogs.com/Smart-Du/p/4328691.html
Copyright © 2011-2022 走看看