操作符重载与临时对象

    在C++中,操作符重载的意思就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。C++中有许多内置的数据类型,如char,int,float等,每一种类型都有许多运算符,如加、减、乘、除等。当用户定义了类的对象时,对象之间是不能直接使用这些运算符进行操作的,比如复数的加法。没有重载+运算符,编译器是不知道将复数的实部和实部相加,虚部和虚部相加的。这就是操作符重载出现的目的。

    操作符重载有三种形式,一种是重载为类的成员函数(this),一种是重载为类的非成员函数(无this),另一种是重载为类的友元函数。

    操作符重载为类的成员函数的一般语法形式为:

函数类型 operator 运算符 (形参表)
{
  函数体;
}

    操作符重载为类的友元函数的一般语法形式为:

friend 函数类型 operator 运算符 (形参表)
{
  函数体;
}

    当操作符重载为类的成员函数时,操作符重载的参数会比作为友元或者独立于类的操作符函数少一个参数,因为操作符重载类成员函数会把调用该函数的对象作为函数的第一个参数,也就是隐含的this指针指向调用该函数的第一个对象,所以会少一个参数。我们来看这样一个例子:


    当调用类中定义的操作符重载函数时最左边的对象是调用操作符重载函数时的对象。比如在类complex中重定义的+=操作符complex::operator += (const complex& r) { }(只有一个参数,this是隐藏参数),有类complex的对象c2和c1则调用操作符重载函数的方法有c2 += c1和c2.operator += c1,前一条语句会自动转换为后面这条语句,且c2 += c1的表达式中最左边的对象c2是调用操作符重载函数的对象,而右边的c1将被作为参数传送。

    另外我们注意到,在上面的例子中函数的返回值类型为引用,传递者无需知道接收者是以reference形式接收的。

    当函数重载为非成员函数时,我们来看下面的例子:


        我们注意到函数体中返回的complex( )是个临时对象(temp object),这些函数绝不可return by reference,因为它们返回的必定是个local object。=(赋值运算符)、()(函数调用运算符)、[ ](下标运算符)、->(通过指针访问类成员的运算符)这四种运算符只能通过成员函数重载,剩余的运算符可以通过成员或者非成员函数重载。

    重载的限制:

    (1)并不是所有的运算符都能被重载。除了.,.*,::,?:,sizeof,typeid这几个运算符不能被重载,其他运算符都能被重载;

    (2)重载不能改变该运算符用于内置类型时的含义,程序猿不能改变+运算符用于两个int型时的含义;

    (3)运算符函数的参数至少有一个必须是类的对象或者类的对象的引用,这种规定可以防止程序猿运用运算符改变内置类型的函数;

    (4)重载不能改变运算符的优先级;

    (5)重载不能改变运算符的结合律;

    (6)重载不能改变运算符操作数的个数,比如+需要两个操作数,则重载的+也必须要有两个操作数。

猜你喜欢

转载自blog.csdn.net/susu0203/article/details/79688374