C++运算符重载

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/29

C++运算符重载以及友元简介。

一、成员运算符重载
这个比较简单,运算符左侧的对象表示调用对象,运算符右侧的对象是作为参数的对象。
例如

myComplex c;
c*3.2

表示c.operator*(3.2)

二、非成员运算符重载函数
同上例,如果遇到输入3.2*c的时候,由于3.2属于double类型,double类型里面没有重载operator*(myComplex)因此直接调用会出错。
这时的解决办法是使用非成员运算符重载。运算符左边的操作数对应于运算符的第一个参数,运算符表达式右边的操作数对应于运算符函数的第二个参数。函数原型如下:

myComplex operator*(const double& k, const myComplex& c);

三、友元
非成员函数有一个问题就是不能访问类的私有变量,为了解决这个问题C++定义了一类特殊的非成员函数—友元。在自定义类的声明中添加friend关键字后,在友元函数中对自定义类操作的时候就可以访问自定义类的私有成员。
这里要求把友元函数原型在类声明中是为了保证数据隐藏原则。

四、示例代码
自定义复数类.h

#include <iostream>
using namespace std;

class myComplex
{
private:
    double x, y;
public:
    myComplex(void){};
    myComplex(double ix) :x(ix), y(0){};
    myComplex(double ix, double iy) :x(ix), y(iy){};
    ~myComplex(void){};

    myComplex operator+(const myComplex& c);
    myComplex& operator+=(const myComplex& c);
    myComplex& operator=(const myComplex& c);
    bool operator <(const myComplex& c)const;
    bool operator ==(const myComplex& c)const;
    myComplex operator*(const double& k)const;

    friend myComplex operator*(const double& k, const myComplex& c);
    friend ostream& operator <<(ostream& os, const myComplex& c);
    friend istream& operator >>(istream &is, myComplex& c);
};

自定义复数类.cpp

#include "myComplex.h"
myComplex myComplex::operator + (const myComplex& c)
{
    myComplex result(x + c.x, y + c.y);
    return result;
}
myComplex& myComplex::operator+=(const myComplex& c)
{
    x = x + c.x;
    y = y + c.y;
    return *this;
}
myComplex& myComplex::operator=(const myComplex& c)
{
    x = c.x;
    y = c.y;
    return *this;
}
bool myComplex::operator <(const myComplex& c)const
{
    if (x*x + y*y<c.x*c.x + c.y*c.y)
        return true;
    else
        return false;
}
bool myComplex::operator ==(const myComplex& c)const
{
    if ((x == c.x) && (y == c.y))
        return true;
    else
        return false;
}
myComplex myComplex::operator*(const double& k)const
{
    myComplex result(x*k, y*k);
    return result;
}

myComplex operator*(const double& k,const myComplex& c)
{
    return c*k;
}

ostream& operator <<(ostream& os, const myComplex& c)
{
    cout << "(" << c.x << "," << c.y << ")";
    return os;
}
istream& operator >>(istream &is, myComplex& c)
{
    cout << "real: "; cin >> c.x;
    cout << "imag: "; cin >> c.y;
    return is;
}

五、参考:
C++ primer plus第六版
发现一个很好的博客,标记一下http://blog.csdn.net/zgl_dm/article/details/1767201

你可能感兴趣的:(C++运算符重载)