第四题:
一。思路。做这道题非常的纠结,究其原因,主要还是对基本内容掌握的不够扎实,就是几个简单的重载就写成了这个样子…………
(1)引用的问题
HugeInt operator+(HugeInt p);//重载+。两个类相加的类型
HugeInt HugeInt::operator +(int num)
{
int i;
HugeInt r(0);
for ( i = 0; i < MAX ; i ++ )
{
    r.value[i] += value[i] + num % 10;
    if ( r.value[i] > 9 ){
        r.value[i] -= 10;
        r.value[i+1] ++;
    }
    num /= 10;
}
if ( value[len] ) len ++;
r.len = len;
return r;
}
如果写成这个样子HugeInt & operator(HugeInt p),就会报错,因为可以看到,r是在函数中才定义的,但是传值为引用的话,就是这样
HugeInt & temp = r;也就是说temp和r公用一段内存空间,他们就是一个东西,但是因为temp是局部定义的,而隐含着的HugeInt & temp 斌斌不是在这

个函数中定义的,所以可能根本知不道任何东西,这是非常危险的,会报错
这个改正的方法是
HugeInt r(0);把这句改为static HugeInt r(0);然后就可以定义为这个样子HugeInt & operator(HugeInt p)

在钱能的书中详细讲述了函数返回值是引用时的一些情况

#include<iostream>

using namespace std;

float temp;

float fn1(float r)

{

temp=r*r;

return temp;

}

float &fn2(float r)

{

temp=r*r;

return temp;

}

int main()

{

float a=fn1(5.0);

float &b=fn1(5.0);

float c=fn2(5.0);

float &d=fn2(5.0);

return 0;

}

首先,请注意temp是全局量,这点很重要。

然后,需要明确函数返回值的方式,以最简单的fn1为例,返回值是temp,但是编译器并不直接返回temp,而是创建一个临时变量t,然后把temp的值赋给t,

返回主函数之后,float a=fn1(5.0);其实就是float a=t;然后编译器把t  delete掉

看第二种方式,此时就是说b和t指向的是同一段内存空间,但是我们知道编译器在解释完这一句话之后就会自动把临时变量t  delete,那么这时t指向的是什么东西呢?有一些编译器可能会对这种情况有特殊解释,但是不能保证在每一个编译器上都能解释,所以这是很危险的写法

此时最好写为这样(主函数中)float x=fn2(5.0);float &b=x;

第三种模式,此时不会创建新的内存空间,因为返回的是引用,编译器默认为不生成临时变量t而是直接赋值,所以会提高效率

第四种方式就是让三种中的&c=t;但是如果temp不是全局量就会有问题!还是与二相同的问题

 

 

(2)c++规定重载++时,如果有形参参数中有int,就是后置自增,否则为前置自增。(int  是没有用的)

(3)

重载为普通函数时,参数个数为运算符目数
重载为成员函数时,参数个数为运算符目数减一。这两条蛮重要的,加以留心!

第三题:

此题的有点歪,我想成了重载<<,但是实际上是没有必要的,直接重载[],与()即可

posted on 2010-05-14 18:48  梦涵  阅读(305)  评论(0编辑  收藏  举报