Giskard

(四)运算符重载

2019-01-27

C++预定义的“+”、“-”运算只支持基本数据类型,并不支持用户自定义类型。

复数类的加减运算不能采用系统预定义的运算符“+”、“-”完成,那么编写成员函数来实现加、减运算。

完成复数与复数相加

Complex Complex::add(Complex &c)
{
    Complex temp;
    temp.real = real + c.real;
    temp.image = image + c.image;
    return temp;
}

完成复数与实数相加

Complex Complex::add(double d)
{
    Complex temp;
    temp.real = real + d;
    temp.image = image;
    return temp;
}
Complex c1(2, 2.5);
Complex c2(3, 1.4);
Complex c3;
c3=c1.add(c2);

缺点:不如c3=c1+c2直观!!

运算符重载本质上是一种特殊的函数重载

class Complex        //复数类
{
public:
    Complex(double r=0.0,double i=0.0){real=r;image=i;} 
    const double Real(){return real;}
    const double Imag(){return image;} 
    Complex operator+( Complex &c); //重载运算符“+”
private:
    double real,image; 
};

++为前置运算符时,它的运算符重载函数的一般格式为:

operator ++( )

++为后置运算符时,它的运算符重载函数的一般格式为:

operator ++(int)

重载运算符

友元函数的调用,直接调用

友元函数近似于普通的函数,它不带有this指针,因此必须将对象名或对象的引用作为友元函数的参数,这样才能访问到对象的成员。

友元函数必须在类的定义中声明,其函数体可在类内定义,也可在类外定义。

友元函数可以访问该类中的所有成员(公有的、私有的和保护的),而一般函数只能访问类中的公有成员。

友元关系是不能传递的。B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。

运算符重载有两种方式:运算符重载为类的成员函数,运算符重载为类的友元函数。

运算符重载为成员函数时,是由一个操作数调用另一个操作数。

运算符重载为友元函数,参与运算的对象全部成为函数参数。

重载运算符2

++为前置运算符时,它的运算符重载函数的一般格式为:

A operator ++(A &a)

++为后置运算符时,它的运算符重载函数的一般格式为:

A operator ++(A &a, int)

若想一次输入某个对象。cin>>s1;

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

friend  istream &  operator >>(istream &, ClassName &);
friend  ostream &  operater <<(ostream &, ClassName &);

基本类型到类类型的转换,不能用友元

Tags: C/C++