程设13次作业总结--运算符重载
第四題:
一。思路。做這道題非常的糾結,究其原因,主要還是對基本內容掌握的不夠扎實,就是幾個簡單的重載就寫成了這個樣子…………
(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)
重載為普通函數時,參數個數為運算符目數
重載為成員函數時,參數個數為運算符目數減一。這兩條蠻重要的,加以留心!
第三題:
此題的有點歪,我想成了重載<<,但是實際上是沒有必要的,直接重載[],與()即可
轉載于:https://www.cnblogs.com/pkusirius/archive/2010/05/14/1735718.html
總結
以上是生活随笔為你收集整理的程设13次作业总结--运算符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dd命令快速生成一个大文件
- 下一篇: mysql 非自然月统计_MySQL性能