第四题:
一。思路。做这道题非常的纠结,究其原因,主要还是对基本内容掌握的不够扎实,就是几个简单的重载就写成了这个样子…………
(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)
重载为普通函数时,参数个数为运算符目数
重载为成员函数时,参数个数为运算符目数减一。这两条蛮重要的,加以留心!
第三题:
此题的有点歪,我想成了重载<<,但是实际上是没有必要的,直接重载[],与()即可