以引用的方式傳遞引數避免物件切割

2021-07-09 13:17:29 字數 824 閱讀 8222

當乙個子類物件以傳值的方式傳遞並被視為乙個基類物件,基類的copy建構函式會被呼叫,而造成「此物件的行為像個子類物件」的那些性質被完全切割掉,僅留下乙個基類物件。

例如:

class window;

class windowwithscrollbars :public window;

現在假設你希望寫個函式列印視窗名稱,然後顯示該視窗。下面是錯誤示範:

void printnameanddisplay(window w)

當你呼叫上述函式並交給它乙個windowwitnscrollbars對像,會發生什麼?

windowwithscrollbars wwsb;

printnameanddisplay(wwsb);

引數w會被構造成乙個window對像,而造成wwsb「是個windowwitnscrollbars物件」的那些資訊會被切除。在printnameanddisplay內不論傳遞過來的物件原型是什麼型別,引數w就像乙個window物件。因此在printnameanddisplay內呼叫display呼叫的總是window::display,絕不是windowwithscrollbars::display。

解決切割問題的辦法,就是以(常量)引用的方式傳遞w:

void printnameanddisplay(const window& w)

現在,傳進來的視窗是什麼型別,w就表現為那種型別。

(來自effective c++)

python引數傳遞 物件的引用

大家都知道在python中,一切皆物件,變數也不再具有型別,變數僅僅是物件的乙個引用,我們通常用變數來測型別,通常測得就是被這個變數引用得物件的型別。python採用的是傳遞物件的引用,為了方便說明,我們來看乙個例子 test 1 defchange1 a a 2 defchange2 a chan...

Python引數傳遞物件的引用原理解析

大家都知道在python中,一切皆物件,變數也不再具有型別,變數僅僅是物件的乙個引用,我們通常用變數來測型別,通常測得就是被這個變數引用得物件的型別。python採用的是傳遞物件的引用,為了方便說明,我們來看乙個例子 qsmbpkrybtest 1 def change1 a a 2 def cha...

值傳遞和引用傳遞 函式引數傳遞的兩種方式

在定義函式時函式括號中的變數名成為形式引數,簡稱形參或虛擬引數 在主調函式中呼叫乙個函式時,該函式括號中的引數名稱為實際引數,簡稱實參,實參可以是常量 變數或表示式。1 c語言中實參和形參之間的額資料傳遞是單向的 值傳遞 單向傳遞,只能由實參傳給形參,反之不能。2 被呼叫函式的形參只有函式被呼叫時才...