為什麼C++不能返回數組?

C++裡面能夠返回整數、浮點數、指針,甚至可以是對象和結構,而且如果數組包含在對象或者結構中也可以返回的,在設計C++的時候為什麼就只有數組不能返回呢?


我認為原因有2個。

一是數組本身就是很尷尬的東西:常量長度的數組,幾乎沒有實用價值;動態分配連續內存空間的數組,必須同時返回長度和初始地址兩樣信息,結果還不如封裝成vector。

二是數組和對象這些類型可以做得很大。如果像簡單數據類型那樣每次返回都要複製,會非常沒有效率。因此更好的方法是讓函數只傳遞引用,把計算出來的數組留在原地。但是函數執行時創建的所有變數,除了new出來的以外,都會在返回的時候消亡。因此往往都是先在函數外創建好數組,然後用指針或引用作為參數傳遞給函數。


因為在 C 語言的遊戲規則下,你根本寫不出數組類型的表達式供 return 返回呀。

儘可能地兼容 C 語言是 C++ 的成功法門之一。寫不出數組類型的表達式供 return 返回對於 C++ 新增的功能來說無關痛癢,但 C++ 如果在這種不必要的地方和 C 語言不一致,不僅語言中要改的地方會非常多,還會面臨各種兼容性問題,明顯是自己找不愉快呀。

p.s. C++ 從另一個角度滿足了返回數組的需求:std::vector&<&> 和 std::array&<&>(不嫌麻煩的話還可以把數組引用也算上)。

C99 §6.3.2.1/3

Except when it is the operand of the sizeof operator or the unary operator, or is a string literal used to initialize an array, an expression that has type 『『array of type』』 is converted to an expression with type 『『pointer to type』』 that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.


因為數組在 C/C++ 里是二等公民。


還是底層知識不夠了解啊。你說的能返回對象,那是因為這種情況下對象被分配到堆裡面了,而你若是直接定義對象,他在棧裡面就不能返回了,即使能返回,也是因為編譯器加了代碼,生成了臨時對象才能返回。而返回值,指針之類的由於都是4位元組以內的(暫時忽略長整形之類的),直接通過寄存器返回。總之C++能返回的只有在堆裡面或是通過寄存器來暫存的,在函數退出後這個函數的棧裡面的內容便會全部沒用了,就是所謂的不可預測的值。


因為等返回好的時候數組元素們已經不在棧里了


事實上,你可以把數組封裝到一個類中,如果數組的原數是可以拷貝的,那麼編譯器會自動合成這個封裝類的拷貝操作,這樣就支持拷貝了。還有新標準封裝了數組,是可以拷貝的。


真要返回數組,你打算怎麼接收這個返回值? C和C++ 禁止數組複製.


補充,非要copy數組也行,std::array, 相當於用結構體繞過這個限制了

ps,沒看清題,題主已經提到這個了,匿


可以返回指針就夠了啊,如果你不滿足於返回的是指針,完全可以memcpy一下就好了。


推薦閱讀:

現在有哪些比較大型的網站是用 Python 開發的?
零基礎如何學好編程?
應該向 Web 開發初學者推薦 PHP、Python 還是 Ruby ?理由是什麼?
使用Rust的開發效率怎麼樣?
哪些書籍能提高程序員的演算法能力?

TAG:編程語言 | C | CC | 編程理論 |