C++运算符号重载

来源:互联网 发布:淘宝儿童牛仔裤 编辑:程序博客网 时间:2024/06/02 16:22

代码如下

#include<stdio.h>
using namespace System;
class A
{
public:
 int a;
public:
 A (int x) ;
 A& operator = (A &x);
 A operator + (const A &x); 
};

A:: A(int x)
{
 a=x; 
}

A A::operator +(const A &x)
{
 return A(a+x.a); 
}

A&  A::operator = (A &x)
{
 a=x.a;
 return *this; 
}
int main(array<System::String ^> ^args)
{
 A a(1),b(2),c(3);
 (a=c)=b;
 printf("%d",a.a);
 while(1);
    return 0;
}

一、为什么要在运算符返回值上加引用?

如上面的代码,如果返回类型加了引用,最后的结果是2,不加的话是3,原因是添加了引用,返回的将不会是一个临时对象,临时对象只能用来赋值给其他对象,比如a=c之后如果不加引用返回的是一个临时对象,那么后面的a=b就没有意义了,因为b赋值给的是a=c之后返回的一个临时对象,临时对象在函数结束之后就被回收了,如果要把这个临时对象保存下来,通过返回引用的操作让a替代这个临时对象继续生存下去。与a公用一个空间,只要把这个临时对象的引用值传给了a,那么改变这个临时对象就是改变a的值。整个过程就是先执行a=c,返回一个临时对象,然后把b的值传给了这个临时对象,那么因为这个对象的引用传给了a,所以改变这个对象就是改变a的值。另外一个就是加引用可以防止产生拷贝构造函数和析构函数的调用,说到底其实就是为了提升效率的问题,当然不加也是不会有问题的。

 

二、为什么要在重载运算符的参数中加引用?

其实可以不加,加了完全是为了提高效率,如果加了引用,那么就不用再产生一个临时对象,由于传递引用的话修改这个变量就等于修改外面的值,所以一般加上const防止值被意外的修改

 

0 0