悶在家裡,無聊啊~~~~~
看資料結構C++描述的,清華的黃皮書,書有夠爛。講的索然無味,而且書中錯誤N多~~汗!
裡面有個結構都是用template寫的,說到最小堆的時候,有個函數重載,
const MinHeap <Type> & operator = (const MinHeap &R); 說是堆複製賦值
然後它的建構函式就開始扯了:
template <class Type> MinHeap<Type>::MinHeap(Type arr[],int n)
{
MaxHeapSize=Default <n?:n:DefaultSize;
heap = new Type [MaxHeapSize];
heap = arr; //這句注釋成複製堆數組
............
}
愣是讓我半天沒憋出來,後來才想起來有個運算子多載,暈,可是這 arr 好像是指標吧,能這樣啊~~
再說了,返回的還是const呢~~暈
不用說了,自己改吧,由於重載的是指標 所以寫成:
Type * operator = (const Type * R)
本想保留返回一個&的,怎麼也想不同。以前對函數傳遞的理解是認為 如果是傳值,就是先產生一個臨時變數,然後在把臨時變數賦值給行參,指標的話就是傳遞地址,變數名其實是地址的別名,不佔用記憶體,指標傳遞的時候也會產生臨時變數,只不過只是4個位元組罷了。
今天用了個小程式反組譯碼了下:
void fun(int a)
{
a=3;
}
int main()
{
int b=3;
fun(b);
return 0;
}
VC6.0下調試,結果傳遞的時候如下:
首先 是mov ax,[ebp-4]
然後直接就push ax了,暈,傳遞完畢,嘿嘿,原來這就是所謂的臨時變數啊~~~
在子函數立裡面使用的時候,修改的實際上是堆棧裡的值,直接改拉,函數返回,堆棧就自動釋放了,難怪不能儲存
在用指標傳的時候 :
lea ax,[ebp-4]
push ax
看見差別了吧,用lea取得b的地址,壓入堆棧,以後操作當然是直接修改了,暈,這也行,經實驗 引用的傳遞方式和指標完全一樣,程式不知道怎麼知道這是引用的哈,看來得學學編譯原理了。:)