回答
這裏有幾個經驗法則您的選項之間進行選擇時非常有用:
如果不需要修改的對象被傳遞到函數,考慮是否的大小對象小於或等於指針的大小。如果是這樣,按價值傳遞;否則,通過const引用傳遞。
如果你做需要修改傳入函數的對象,考慮參數是否可選(即null是一個有效的參數)。如果是這樣,通過指針;否則,通過非const引用。
Google只建議const引用,因爲他們認爲當函數可以修改對象時傳遞指針會更清晰。這可能是真的,但我更喜歡只在null是可接受的值時才使用指針。
爲了澄清,下面是一個解釋其論證根源的例子。
Car c;
foo(c);
無論C是功能完全取決於它是如何聲明,只是看着調用本身並沒有給太多的指示,以什麼可能發生改變。
void foo(Car c);
void foo(const Car &c); OR
void foo(Car &c);
現在考慮
Car c;
foo(&c);
已經通過你的對象的地址,很容易看到(從呼叫者的角度)的功能是否可能會改變你的對象。當然,它不是一個保證,因爲它可能是一個指向const對象的指針,但是從代碼審閱者的角度來看,更容易檢測到該對象可能隨着函數傳遞指針而改變。當Google的建議嚴格執行時,通過指針傳遞的對象總是可變的,而不通過指針傳遞的任何東西都是const。 (通過const &或通過值的b/c)
這是否更好是有爭議的。我會決定你在團隊中的感受和一致性。
很好的解釋,但在複雜的IDE傳遞指針爲時代的緣故的可讀性似乎是一種可疑的做法。 – Duck 2009-11-23 02:33:38
這是Google的做法。他們對很多事情有非常強烈的想法......比如使用不完整的構造函數和'init'方法...我有時會懷疑他們是用C還是C++編程 – 2009-11-23 07:53:58
還可以讓你可以做
無效X(常量的std :: string & X)
X( 「你好」);
沒有const它不會工作。
爲什麼不呢?我沒有看到你在做什麼,你可以擴展嗎? – 2009-11-23 02:16:44
@Newton Falls: 我認爲他的意思是說「臨時值rvalues不能綁定到非常量引用」 – 2009-11-23 14:04:06
這是一個偏好,因爲我可以說這是一個偏好:
void align_left();
// vs.
void alignLeft();
既然你想通過非const的引用來傳遞參數,那麼這樣做。我不喜歡通過指針。該約定通常具有其他含義(即許多程序員看到一個指針,並認爲該參數可能不是必需的,然後必須檢查文檔)。所以你在約定中通常會使參數名稱表明它會改變參數。
t_result getDate(t_string& outString) const;
該名稱表示該突變。如果您在代碼庫中很少通過ref,這可能有點欺騙性,但它最終是「很好」的,並且具有足夠的積極影響。關於風格,很多都回歸到一致性。隨着程序的真正擴展,(IMO)這確實可以幫助 - 只要確保程序的目的是清晰的,風格是一致的(至少在編寫龐大的代碼庫之前,您會喜歡閱讀樣式文檔)。
- 1. 通過引用傳遞const值的C++
- 2. 通過const引用傳遞Qt類
- 3. 通過const引用傳遞的C++
- 4. 引用問題傳遞const對象
- 5. 通過const引用傳遞一個對象?
- 6. 通過const引用複製傳遞C++對象構造函數
- 7. 通過值或通過引用const傳遞std :: chrono :: duration?
- 8. 在C++中,通過引用傳遞一個const布爾值是不是很好?
- 9. C++:錯誤傳遞的const引用
- 10. 將值傳遞給const引用參數?
- 11. 在C++中將臨時對象作爲非const引用傳遞
- 12. 返回的std ::配對與由非const引用傳遞
- 13. 它通過const引用傳遞shared_pointer線程嗎?
- 14. 對非const對象的const引用
- 15. 嘗試引用與const成員通過引用傳遞時刪除的函數
- 16. Java是通過值傳遞還是通過引用傳遞?
- 17. 傳遞右值參數的非const左值引用參數
- 18. 通過引用傳遞與值傳遞
- 19. 我是否正確傳遞參數並通過引用傳遞?
- 20. C++:將枚舉作爲值或作爲const引用傳遞是更好嗎?
- 21. C++通過Const引用並通過Const返回引用
- 22. 通過引用傳遞C++
- 23. C++通過引用傳遞?
- 24. cpp通過引用傳遞
- 25. PHP通過引用傳遞?
- 26. Java通過引用傳遞
- 27. C++通過引用傳遞
- 28. 通過引用傳遞流
- 29. JFrame通過引用傳遞
- 30. 通過引用傳遞LPCWSTR
重複:請參閱http://stackoverflow.com/questions/1322517/passing-a-modifiable-parameter-to-c-function/1322547#1322547 – ChrisW 2009-11-23 02:27:02