c++操作符重载实现

来源:互联网 发布:软件系统技术说明书 编辑:程序博客网 时间:2024/06/05 04:21

为什么要用操作符重载

首先我们看一个例子。

class Complex

{

public:

int a;

int b;

public:

Complex(int a = 0,int b=0)

{

this->a = a;

this->b = b;

}

void print()

{

cout << "a:" << a << endl;

cout << "b:" << b << endl;

}

};

 

 

void main01()

{

Complex c1(1, 2), c2(3, 4);

 

int a = 10, b = 20;

a = a + b;// int 是基础类新,编译器已经为这些类型提供+操作了。

//c1 = c1 + c2;// c1的类型是complex,这种类型是自定义类型,编译器根本不知道如何加。

}

通过这个例子我们知道对于自定义数据类型,编译器根本不知道如何解析操作符。但是c++编译器会给你提供一种机制,让你实现自定义类型加。这就引入了操作符重载的概念。

C++允许用户通过自定义的方式实现操作符重载。

 

操作符重载初探:

class Complex

{

public:

int a;

int b;

public:

Complex(int a = 0,int b=0)

{

this->a = a;

this->b = b;

}

void print()

{

cout << "a:" << a << endl;

cout << "b:" << b << endl;

}

};

 

Complex add(Complex& c1,Complex& c2)

{

Complex tmp;

tmp.a = c1.a + c2.a;

tmp.b = c1.b + c2.b;

return tmp;

}

// 操作符重载首先是通过函数实现的。记住operator+是函数名。

Complex operator+(Complex& c1, Complex& c2)

{

Complex tmp;

tmp.a = c1.a + c2.a;

tmp.b = c1.b + c2.b;

return tmp;

}

 

 

void main()

{

Complex c1(1, 2), c2(3, 4);

 

// Complex c3 = add(c1, c2);

// Complex c3 = operator+(c1, c2);

Complex c3 = c1 + c2;

c3.print();

}

上面的例子我们发现add(c1, c2); operator+(c1, c2); c1 + c2是等价的,换句话说,重载的操作符本质上是一个函数名。

 

 

C++操作符重载有两种方式实现:友元函数,成员函数。

1 友元函数实现操作符重载

class Complex

{

private:

int a;

int b;

friend Complex operator+(Complex &c1, Complex& c2);

friend Complex& operator++(Complex &c2);

public:

Complex(int a = 0, int b = 0)

{

this->a = a;

this->b = b;

}

void print()

{

cout << "a:" << a << endl;

cout << "b:" << b << endl;

}

};

 

// 操作符重载首先是通过函数实现的。operator+是函数名。

Complex operator+(Complex &c1, Complex& c2)

{

Complex tmp;

tmp.a = c1.a + c2.a;

tmp.b = c1.b + c2.b;

return tmp;

}

// 实现前置++;operator++是函数名。

Complex& operator++(Complex &c2)

{

c2.a++;

c2.b++;

return c2;

}

void main()

{

Complex c1(1, 2), c2(3, 4);

Complex c3 = c1 + c2;  //等价于:Complex c3 = operator+(c1, c2);

c3.print();

 

Complex c4(5, 6);

++c4;   //等价于: operator++(c4);

c4.print();

}

 注释:

c++中不能用友元函数重载的运算符有:=  () [ ]    ->

2 成员函数实现操作符重载

class Complex

{

private:

int a;

int b;

public:

Complex(int a = 0, int b = 0)

{

this->a = a;

this->b = b;

}

void print()

{

cout << "a:" << a << endl;

cout << "b:" << b << endl;

}

// 操作符重载首先是通过函数实现的。operator+是函数名。

Complex& operator+(Complex& c2)

{

a = a + c2.a;

b = b + c2.b;

return *this;

}

Complex& operator++()

{

this->a++;

this->b++;

return *this;

}

};

void main()

{

Complex c1(1, 2), c2(3, 4);

Complex c3 = c1 + c2;//相当于Complex c3 = c1.operator+(c2);

c3.print();

 

Complex c4(5, 6);

++c4;//相当于  c4.operator++();

c4.print();

}

0 0
原创粉丝点击