从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载

转:http://blog.csdn.net/jnu_simba/article/details/9293455

一、++运算符重载


前置++运算符重载
成员函数的方式重载,原型为:

函数类型 & operator++();

友元函数的方式重载,原型为:

friend 函数类型 & operator++(类类型 &);


后置++运算符重载
成员函数的方式重载,原型为:

函数类型  operator++(int);

友元函数的方式重载,原型为:

friend 函数类型  operator++(类类型 &, int);


 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _INTEGER_H_
#define _INTEGER_H_

class Integer
{
public:
    Integer( int n);
    ~Integer();

    Integer & operator++();
     //friend Integer& operator++(Integer& i);

    Integer  operator++( int n);
     //friend Integer operator++(Integer& i, int n);

     void Display()  const;
private:
     int n_;
};

#endif  // _INTEGER_H_

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include  "Integer.h"
#include <iostream>
using  namespace std;

Integer::Integer( int n) : n_(n)
{
}

Integer::~Integer()
{
}

Integer &Integer:: operator ++()
{
     //cout<<"Integer& Integer::operator ++()"<<endl;
    ++n_;
     return * this;
}

//Integer& operator++(Integer& i)
//{
//  //cout<<"Integer& operator++(Integer& i)"<<endl;
//  ++i.n_;
//  return i;
//}

Integer Integer:: operator++( int n)
{
     //cout<<"Integer& Integer::operator ++()"<<endl;
     //n_++;
    Integer tmp(n_);
    n_++;
     return tmp;
}

//Integer operator++(Integer& i, int n)
//{
//  Integer tmp(i.n_);
//  i.n_++;
//  return tmp;
//}

void Integer::Display()  const
{
    cout << n_ << endl;
}

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include  "Integer.h"
#include <iostream>
using  namespace std;


int main( void)
{
    Integer n( 100);
    n.Display();

    Integer n2 = ++n;
    n.Display();
    n2.Display();

    Integer n3 = n++;
    n.Display();
    n3.Display();


     return  0;
}

从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载_第1张图片


需要注意的是为了区别于前置++,后置++多了一个int 参数,但实际上是没作用的,设置断点调试的时候可以发现默认赋值为0。

而且此时成员函数不能与友元函数共存,因为调用++运算符时不明确。


二、赋值运算符重载、!运算符重载


 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef _STRING_H_
#define _STRING_H_

class String
{
public:
     explicit String( const  char *str =  "");
    String( const String &other);
    String & operator=( const String &other);
    String & operator=( const  char *str);

     bool  operator!()  const;
    ~String( void);

     void Display()  const;

private:
     char *AllocAndCpy( const  char *str);
     char *str_;
};

#endif  // _STRING_H_

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#pragma warning(disable: 4996)
#include  "String.h"
#include <string.h>
#include <iostream>
using  namespace std;

String::String( const  char *str)
{
    str_ = AllocAndCpy(str);
}

String::String( const String &other)
{
    str_ = AllocAndCpy(other.str_);
}

String &String:: operator=( const String &other)
{
     if ( this == &other)
         return * this;

     delete[] str_;
    str_ = AllocAndCpy(other.str_);
     return * this;
}

String &String:: operator=( const  char *str)
{
     delete[] str_;
    str_ = AllocAndCpy(str);
     return * this;
}

bool String:: operator!()  const
{
     return strlen(str_) !=  0;
}

String::~String()
{
     delete[] str_;
}

char *String::AllocAndCpy( const  char *str)
{
     int len = strlen(str) +  1;
     char *newstr =  new  char[len];
    memset(newstr,  0, len);
    strcpy(newstr, str);

     return newstr;
}

void String::Display()  const
{
    cout << str_ << endl;
}

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include  "String.h"
#include <iostream>
using  namespace std;


int main( void)
{
    String s1( "abc");
    String s2(s1);

    String s3;
    s3 = s1;
    s3.Display();

    s3 =  "xxxx";
    s3.Display();

    String s4;
     bool notempty;
    notempty = !s4;
    cout << notempty << endl;

    s4 =  "aaaa";
    notempty = !s4;
    cout << notempty << endl;

     return  0;
}

需要注意的是我们将构造函数声明为explicit,故s3 = "xxxx"; 不能将"xxxx" 先隐式转换成临时String再调用 String &operator=(const String &other);

可以再重载一个 String& operator=(const char* str); 函数。!运算符这里指当字符串不为空时为真。


从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载_第2张图片


参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范


 

你可能感兴趣的:(从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载)