2009-11-23 54 views
0

我碰到過這個。是否更好地通過引用對非const傳遞引用進行const傳遞?

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Reference_Arguments#Reference_Arguments

按照風格指南,只有常量引用是允許作爲參數。 (這就是我所理解的)

雖然,我似乎不喜歡那種方法。

評論?

+0

重複:請參閱http://stackoverflow.com/questions/1322517/passing-a-modifiable-parameter-to-c-function/1322547#1322547 – ChrisW 2009-11-23 02:27:02

回答

5

這裏有幾個經驗法則您的選項之間進行選擇時非常有用:

如果需要修改的對象被傳遞到函數,考慮是否的大小對象小於或等於指針的大小。如果是這樣,按價值傳遞;否則,通過const引用傳遞。

如果你需要修改傳入函數的對象,考慮參數是否可選(即null是一個有效的參數)。如果是這樣,通過指針;否則,通過非const引用。

6

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)

這是否更好是有爭議的。我會決定你在團隊中的感受和一致性。

+0

很好的解釋,但在複雜的IDE傳遞指針爲時代的緣故的可讀性似乎是一種可疑的做法。 – Duck 2009-11-23 02:33:38

+2

這是Google的做法。他們對很多事情有非常強烈的想法......比如使用不完整的構造函數和'init'方法...我有時會懷疑他們是用C還是C++編程 – 2009-11-23 07:53:58

1

還可以讓你可以做

無效X(常量的std :: string & X)

X( 「你好」);

沒有const它不會工作。

+1

爲什麼不呢?我沒有看到你在做什麼,你可以擴展嗎? – 2009-11-23 02:16:44

+0

@Newton Falls: 我認爲他的意思是說「臨時值rvalues不能綁定到非常量引用」 – 2009-11-23 14:04:06

1

這是一個偏好,因爲我可以說這是一個偏好:

void align_left(); 
// vs. 
void alignLeft(); 

既然你想通過非const的引用來傳遞參數,那麼這樣做。我不喜歡通過指針。該約定通常具有其他含義(即許多程序員看到一個指針,並認爲該參數可能不是必需的,然後必須檢查文檔)。所以你在約定中通常會使參數名稱表明它會改變參數。

t_result getDate(t_string& outString) const; 

該名稱表示該突變。如果您在代碼庫中很少通過ref,這可能有點欺騙性,但它最終是「很好」的,並且具有足夠的積極影響。關於風格,很多都回歸到一致性。隨着程序的真正擴展,(IMO)這確實可以幫助 - 只要確保程序的目的是清晰的,風格是一致的(至少在編寫龐大的代碼庫之前,您會喜歡閱讀樣式文檔)。