java基础改学C++(八)运算符重载

来源:互联网 发布:长江航运能力 知乎 编辑:程序博客网 时间:2024/06/05 11:10


运算符重载就是 定义一个函数,并告诉编译器,遇到这个重载运算符就调用该函数,由这个函数来完成该运算符应该完成的操作,这种函数称为运算符重载函数,它通常是类的成员函数或者是友元函数运算符的操作数通常也应该是类的对象。因此:




看demo更好理解:


demo 复数类:


class Complex{

private:

    float real,virt;

public:

    Complex(){real =0; virt =0;}

    Complex(float a,float i):real(a),virt(i){}

    void display();

    Complexoperator+(Complex&);

    voidoperator+=(Complex&);

    Complexoperator++();//括号里加int,则是后置的++。现在是前置的

};


Complex Complex::operator++(void){


    real++;

    virt++;

    return *this;

}



void Complex::operator+=(Complex&c){

    real =real+c.real;

    virt =virt+c.virt;

}

Complex Complex::operator+(Complex&c){

    

        Complex com;

        com.real =real+c.real;

        com.virt =virt+c.virt;

        return com;

}


void Complex::display(){

    cout<<real<<'\t'<<virt<<endl;

}


int main()

{

    Complex c1(10,10);

    Complex c2(5,1);

    Complex c3 = c1+c2;  // 实际上是c3=c1.operator+(c2);函数的实参有1或0个

    c3+=c2;

    ++c3;

    c3.display();

}

PS。重载不能改变运算符运算对象(即操作数)的个数,且优先级和结合律不能改变。附:





另外,

重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。即参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。


重载运算符做有缘函数:





还可以是既非类的成员函数也不是友元函数的普通函数:

极少的情况下才使用既不是类的成员函数也不是友元函数的普通函数,原因是普通函数不能直接访问的私成员。

如果将运算符重载函数作为成员函数,可以通过this指针自由地访问本类的数据成员,少写一个函数的参数。但必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象,而且与运算符函数的类型相同,必须通过类的对象去调用该类的成员函数,(此段话没意思)

但有时候 要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式2+c2, 运算符左侧的操作数是整数),这时是无法利用前面定义的重载运算符的,因为无法调用2.operator+函数。这时就肯定不能作为成员函数了,用非成员,如果涉及类的私有成员,则做friend


C++规定,赋值运算符=、下标运算符[]、函数调用运算符()、成员运算符->必须定义为类的成员函数

流插入运算符“<<”、流提取运算符“>>”、类型转换运算符不能定义为类的成员函数,只能作为友元函数

一般将单目运算符和复合运算符重载为成员函数

一般将双目运算符重载为友元函数


剩下的以后再说,,,





1 0
原创粉丝点击