簡體   English   中英

C ++函數和方法樣式

[英]C++ functions and methods style

例如,我們有一個函數,其結果是一個數組。 我經常看到這樣的事情:

void func(some_args, result_array){//some code//} 

因此,您可以看到函數不返回數組,我們將其作為參數傳遞。

第二種情況如下:

float* func(some_args){ //some code// return result_array;}

是否有關於此的約定或這只是個人偏好? 就個人而言,我注意到第二個聲明,它返回一個數組,是非常罕見的。 這有什么理由嗎?

UPD :我很抱歉不精確。 當然,我在第二種情況下暗示了一個指向數組的指針。

所有權差異。

void func(some_args, float*);

VS

float* func(some_args);

在第一種形式中,很明顯誰負責為陣列提供內存。 在第二個原因中存在歧義:您調用的函數是擁有內存還是正在傳輸給您。 誰負責delete [] ing?

char* s = strdup("hello");
// I have to remember to 'free()' what was strdup'd
// but what if I think "this is C++" and delete[] it?

- 編輯 -

這可能部分地促成了C ++ 11s智能指針( std::unique_ptrstd::shared_ptr )的發展,因此比所討論的兩個更好的選擇是使用其中一個。

std :: unique_ptr func(some_args);

這明確指出“我會給你一個你負責的東西”。

數組是C ++類型系統中的“二等”公民。

你應該做的是返回一個容器(例如std::vector ),因為那些語言更均勻地處理它們。

數組的問題是

  • 在大多數情況下,它們會“衰減”為指向第一個元素的指針,從而丟失大小信息
  • 數組的大小是編譯時常量

std::vector是一個圍繞動態分配的數組的瘦包裝,但可以傳遞給函數或像任何其他值類型一樣進行操作,並且大小也是運行時值。 當然,沒有黃金法則可以永遠應用...但是大多數情況下,在C語言中使用C ++中的數組時,使用std::vector代替。

是否有任何約定

是的,這個問題有一個“慣例”。

大多數專業環境都有編碼標准。 還將有同行評審和(可能)靜態分析儀來檢測和執行標准。

例如,“谷歌C ++風格指南”(猜測它是多么容易找到),標識參數排序:

定義函數時,參數順序為:輸入,然后輸出。

C / C ++函數的參數既可以是函數的輸入,也可以是函數的輸出,或者兩者兼而有之。 輸入參數通常是值或const引用,而輸出和輸入/輸出參數將是非常量指針。 在訂購功能參數時,將所有僅輸入參數放在任何輸出參數之前。 特別是,不要僅僅因為它們是新的而在函數末尾添加新參數; 在輸出參數之前放置新的僅輸入參數。

這不是一個嚴格的規則。 輸入和輸出的參數(通常是類/結構)使水域變得混亂,並且一如既往地,與相關功能的一致性可能需要您彎曲規則。

我還要補充說,編寫了許多可能不符合本指南的代碼。 我的最后一次演出堅持編碼員讓他們的代碼匹配任何相關的代碼...而不是那里的“清晰”目標。


你不恰當地提出你的第一個案件:

void func(some_args, result_array){//some code//} 

所以,讓我嘗試一個更多提示的演示文稿:

Google C ++樣式指南討論的慣例可能更好地表示為

void func(T1 argIn1, 
          T2 argIn2, 
          const T3& argIn3,
          std::vector<T4>& argOut4);

所以argIn1和argIn2按值傳遞給func,並且顯然是輸入。

argIn3是const ref,也是一個輸入。 這是如何將大輸入傳遞給函數而不會產生副本的成本。

argOut4由非常量引用傳遞,在這種情況下,肯定是輸出,但可能被視為輸入和輸出。


有很多代碼示例(例如linux api等),函數返回一些東西。 您可以自行計算並確定是否有任何結果適用於您的工作。 我可以找到很多(例如memcmp),其中返回值是重要結果,但我感覺(我還沒有確認)大多數(或者更多)歷史函數返回狀態...成功時可能為0,或者-1當錯誤和errno中的值來描述時。

因此,這些天,我更喜歡返回std :: string。 當返回size()為0時,未發生錯誤,否則,將在字符串中捕獲錯誤描述。


你的第二個案例也說不好。 函數和方法只能返回1個東西......它可以是一個類或結構並填充信息,但函數語義只能返回一個項目。

遵循風格指南(任何編碼標准)是一件好事。 我已經按照Google風格指南的幾個部分進行了幾年的跟蹤。 它與我的標准練習很容易合並。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM