操作符重载举例

一.输入输出

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Complex
 5 {
 6 public:
 7     Complex()
 8     {
 9         real = 0;
10         imag = 0;
11     }
12     
13     Complex(double r)
14     {
15         real = r;
16         imag = 0;
17     }
18 
19     Complex(double r, double i)
20     {
21         real = r;
22         imag = i;
23     }
24 
25     Complex operator+(const Complex &c) const
26     {
27         Complex s;
28         s.real = real + c.real;
29         s.imag = imag + c.imag;
30         return s;
31     }
32 
33     Complex operator-(const Complex &c)
34     {
35         Complex s;
36         s.real = real - c.real;
37         s.imag = imag - c.imag;
38         return s;
39     }
40 
41     double real, imag;
42 };
43 
44 istream& operator>>(istream &in, Complex &c)
45 {
46     return in >> c.real >> c.imag;
47 }
48 ostream& operator<<(ostream& out, Complex &c);
49 int main()
50 {
51     Complex s;
52     cin >> s;//1 2
53     cout << s.real << " " << s.imag << endl;//1 2
54     return 0;
55 }

 

 

二.赋值

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Point
 5 {
 6 public:
 7 
 8     Point()
 9     {
10         x = 0;
11         y = 0;
12     }
13 
14     Point(int a, int b)
15     {
16         x = a;
17         y = b;
18     }
19 
20     Point& operator=(const Point& p)
21     {
22         x = p.x;
23         y = p.y;
24         return *this;
25     }
26     int x, y;
27 };
28 
29 ostream& operator<<(ostream &out, Point p)
30 {
31     return out << p.x << " " << p.y << endl;
32 }
33 
34 
35 
36 int main()
37 {
38     Point p1, p2, p3(3, 4);
39     p1 = p2 = p3;
40     cout << p1 << p2;
41     /*
42     3 4
43     3 4
44     */
45     return 0;
46 }

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class String
 5 {
 6 public:
 7     String(const char *s)
 8     {
 9         length = strlen(s);
10         p = new char[length + 1];
11         strcpy(p, s);
12     }
13 
14 private:
15     int length;
16     char *p;
17 };
18 
19 void fun(String &aa)
20 {
21     String c("789");
22     c = aa;
23 }
24 
25 
26 int main()
27 {
28     String a("1"), b("x");
29     b = a;//内存泄漏,b.p没有释放
30     fun(a);//a.p将指向一个未定义区域,指针悬浮
31     a = a;//检测两边是否相等
32     return 0;
33 }

 

 1 const String& String::operator=(const String &right)
 2 {
 3     if (this != &right)//防止自我赋值
 4     {
 5         delete[] p;//防止内存泄漏
 6         length = right.length;//取新字符串长度
 7         p = new char[length + 1];//分配内存
 8         for (int i = 0; i < length; i++)
 9         {
10             p[i] = right.p[i];//复制
11         }
12     }
13     return *this;
14 }

 

1 Complex& operator=(string str)
2 {
3     char *p = new char[str.length + 1];
4     strcpy(p, str.c_str());
5     r = atof(strtok(p, "+"));
6     i = atof(strtok(NULL, "i"));
7     return *this;
8 }

 

 

三.下标操作符

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class CharArray
 5 {
 6 public:
 7     CharArray(int len)
 8     {
 9         length = len;
10         p = new char[length];
11     }
12 
13     char& operator[](int i)
14     {
15         static char ch = 0;
16         if (i >= 0 && i < length)
17         {
18             return p[i];
19         }
20         else
21         {
22             cout << "\nout" << endl;
23             return ch;
24         }
25     }
26 
27 private:
28     int length;
29     char *p;
30 };
31 
32 int main()
33 {
34     CharArray str1(6);
35     char *str2 = "abcdefg";
36     for (int i = 0; i < 7; i++)
37     {
38         str1[i] = str2[i];//str2[6]保存在ch里
39     }
40     for (int i = 0; i < 7; i++)
41     {
42         cout << str1[i];
43     }
44     cout << endl;
45     /*
46     out
47     abcdef
48     out
49     g
50     */
51     return 0;
52 }

 

四.函数调用操作符

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class F
 5 {
 6 public:
 7     double operator()(double x, double y) const
 8     {
 9         return 2 * x + y;
10     }
11 };
12 
13 int main()
14 {
15     F f;
16     cout << f(1.5, 3.2) << endl;//6.2
17     return 0;
18 }

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class  Array
 5 {
 6 public:
 7     Array()
 8     {
 9         num = new int[1];
10     }
11     Array(int i, int j)
12     {
13         row = i;
14         col = j;
15         num = new int[row * col];
16     }
17     int* operator[](int i)
18     {
19         return &num[i * col];
20     }
21     int operator()(int i, int j)
22     {
23         return num[i * col + j];
24     }
25     ~Array()
26     {
27         delete[] num;
28     }
29 
30 private:
31     int *num, row, col;
32 };
33 
34 int main()
35 {
36     Array a(3, 4);
37     for (int i = 0; i < 3; i++)
38     {
39         for (int j = 0; j < 4; j++)
40         {
41             a[i][j] = 1;
42         }
43     }
44     cout << a(1, 1) << endl; // 1
45     return 0;
46 }

 

 

 

五.自增/自减

#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        value = 0;
    }
    A(int t)
    {
        value = t;
    }
    A operator++()
    {
        value++;
        return *this;
    }
    A operator++(int)
    {
        A t;
        t.value = value++;
        return t;
        /*
        A a = *this;
        ++(*this);
        return a;
        */
    }
    int value;
};

ostream& operator<<(ostream &out, A a)
{
    return out << a.value << endl;
}

int main()
{
    A a(10);
    cout << a++; // 10
    cout << ++a; // 12
    return 0;
}

 

 

五.转型操作符

声明中不能包含形参和返回类型,但函数体中必须包含return语句,用来返回转型结果。

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A(float num)
 8     {
 9         value = num;
10     }
11     operator int()
12     {
13         return static_cast<int>(value) + 10;
14     }
15 
16     float value;
17 };
18 
19 int main()
20 {
21     A a(8.0);
22     int i = a;
23     cout << i << endl;//18
24     return 0;
25 }

 

 

六.内存管理

new, new[], delete, delete[]

void *类::operator new(size_t size);第一个参数必须是size_t,数值等于将被创建的对象大小

void 类::operator delete(void *p);第一个参数必须是void *

 

posted @ 2016-03-19 20:06  早杰  阅读(274)  评论(0编辑  收藏  举报