2015-11-19 58 views
0

這更像一個倫理問題:引用參數

如果我有以下代碼:

void changeInt(int& value) 
{ 
value = 7; 
} 

和我做的:

int number = 3; 
changeInt(number); 

數量將有值7

我知道當爲changeInt函數創建新的堆棧幀時,將創建新的變量d &值將指向數字。

我在這裏擔心的是,如果調用者沒有注意,可能會被認爲正在傳遞值的模糊,實際上,在函數框架上,會創建一個引用。

我知道他能看在頭文件,它是一個完美的合法的表達,但我仍然覺得它不道德有點:)

我認爲這應該得到某種標記和語法執行。就像在C#中,你有ref關鍵字。

你們認爲什麼?

+4

爲了更清楚地傳遞指針而不是指針。然後調用者需要傳遞'&number'。 – Kevin

+0

@jt_reed調用者應該得到一個編輯器或一個向他顯示函數簽名的IDE。甚至可以記住沒有引用的參數類型,並將函數名稱中嵌入參數類型,例如'changeInt'有點笨拙。 – LogicStuff

+0

記錄文檔的作者和/或閱讀文檔的程序員沒有錯,對吧? – PaulMcKenzie

回答

0

這是引用不如指針清晰的事情之一。然而,使用指針可能會導致這樣的事情:

changeInt(NULL); 

當他們真正應該做的:

changeInt(&number); 

這是一樣糟糕。如果函數有明確名稱,因爲這,它幾乎是一個謎,它實際上改變了傳遞的值

另一種解決方案是當然的事:。

int calculateNewInt(/* may need some input */) 
{ 
    return 7; 
} 

現在

int number = 3; 
... 
number = calculateNewInt(); 

很顯然(可能)正在變化number

但是,如果函數的名字「聽起來像改變了輸入值」,那麼改變這個值絕對是公平的。如果有疑問,請閱讀文檔。如果您編寫的代碼具有您不想更改的局部變量,請將它們設爲const

const int number = 3; 
changeInt(number); /* Makes an error */ 

(當然,這意味着這個數字在別處也是不可更改的)。

0

我知道他能看在頭文件,它是一個完美的合法的表達,但我仍然覺得它不道德有點:)

我認爲這是完全正常的,語言的一部分。實際上,這是C和C++的壞處之一:在處理未知API時,必須始終檢查頭部,因爲調用函數時不會明確地通過引用傳遞。

雖然這不是所有系統語言的情況。 IIRC Rust規定必須明確傳遞引用。