2010-03-30 39 views
4

我需要學習C++以學習構建諾基亞WRT和/或maemo應用程序。 我需要知道哪些陷阱以及我需要/必須學習或專注的C++的哪些方面。 我記住的一件事就是C++沒有垃圾收集器。因此,我需要關注變量類型。但是,有沒有其他人真的很重要,我不能忽視它?學習C++時有什麼困難,如果我來自PHP/Java?

+1

您可能從C++陷阱列表開始:http://stackoverflow.com/questions/30373/what-c​​-pitfalls-should-i-avoid – 2010-03-30 01:59:50

+5

我認爲C++是複雜得多(因爲缺乏更好的詞)比PHP,你不只是學習PHP/Java和C++之間的區別......你學習C++。 – 2010-03-30 02:03:41

+0

是的,我知道我必須學習C++。也許我的措辭是錯誤的。我只需要知道我需要更多地關注哪些語言部分,以便我可以將學習時間集中在特定方面。 – ariefbayu 2010-03-30 02:08:20

回答

13

主要問題是試圖設想C++與PHP或Java的不同之處。

對不起,它只是不這樣工作。除了算術語法之外,C++在幾乎所有重要方面都與這些語言不同。有時候,這些差異是微妙的。您需要全新學習,而不是認爲適合在PHP或Java中執行的操作在C++中適合您。

也就是說,共同的困難包括:

  • 資源管理:RAII;實現拷貝構造函數,析構函數和operator=;避免必須實現副本,dtors,operator =。
  • 瞭解什麼是引用,指針,值和自動變量。
  • 避免未定義的行爲(myarray[i] = i++;是最喜歡的)。 PHP和Java都是比C++更「嚴格」定義的語言:首先,程序的行爲更可能被定義,因此更可靠。正因爲如此,單獨的實現比C++實現更類似。使用C++編寫程序非常簡單,它不僅執行錯誤的操作,而且在不同的運行過程中會做出截然不同的事情,包括崩潰,破壞數據等。
  • 學習安全有效地使用模板,多重繼承,操作符重載以及其他您不熟悉的功能。
  • 正確的投擲和捕捉異常成語(按值拋出,按引用捕獲,不要從析構函數中拋出)。
  • 編寫可移植代碼(瞭解標準保證和不保證的內容之間的區別,但是您的實現恰好要執行實現定義的行爲,例如基本類型的大小)。
  • 與Java或PHP相比,C++的標準庫是有限的。您也將使用非標準庫。例如,Maemo使用GTK +和/或Qt。通常,「我如何在C++中執行X操作」的答案是「只使用標準C++,您需要特定於平臺的API或爲您的系統編譯的便攜式庫」。 X可以是圖形,套接字,正則表達式,多線程,XML處理,加密。特別是對於移動平臺,您需要密切關注操作系統版本,事情可能會隨着時間改變。
2

我會說這不是可變類型,而是要確保清理你的記憶。 Java會清理你的內存,但C++不會爲你做。否則,在出現異常情況下管理資源非常重要。

另一方面,你將得到他們所說的「確定性定稿」。巨大的利益。作爲首字母縮略詞查找「RAII」。我認爲這可以說是C++中最重要的成語之一。

它代表「資源獲取初始化」,但它的真正含義是「當這個析構函數觸發時,即使存在異常,我也會在你之後清理。實際上,這意味着,您創建或打開的任何對象需要關閉或刪除,您可以使用智能指針進行保存。智能指針會在你清理完之後清理。一旦你理解並開始使用它,這是非常非常強大的。它使您的錯誤檢查,異常處理和資源清理代碼非常簡單。

+1

「我認爲它可以說是C++中最重要的成語之一」 - 然而我認爲它是無可辯駁的最重要的一個觀點在C++中的成語;-) – 2010-03-30 02:18:11

3

學習馬上使用STL容器。雖然迭代器語法對來自其他語言的人員不友好,但它爲您提供內置數據結構,您通常在Java集合或PHP中將內置數據結構用作內置函數(映射/散列,列表,堆棧,向量),而無需編寫時髦的指針代碼動態分配,因此經常會讓初學者陷入重新發明輪子和混亂內存錯誤的境地。另外,如果您編寫特定於平臺的代碼(例如Qt或Microsoft MFC應用程序),您經常會看到使用特定於框架的容器的示例,其中STL將是更明智的選擇。 STL(和Boost)可以填補空白。使用GUI框架並不意味着你必須使用框架提供的所有東西。遠離非標準容器,除非您毫無疑問地知道,您永遠不會移植程序或重新使用部分代碼。

1

最重要的事情(在我看來)是一切是值類型,所以如果你傳遞一個數組這樣的功能:

void do_stuff(std::vector<int> my_array) 
{ 
    ... 
} 

,然後將其傳入的my_array複製指定參數的。複製一樣,整個數組是昂貴的,所以一般情況下,要通過常量引用傳遞:

void do_stuff(const std::vector<int>& my_array) 
{ 
    ... 
} 

(注:省略const如果要修改原始my_array)。

2

一個問題我見過一些Java程序員在向C++過渡時出現「try-catch」內存泄漏。例如:

try { 
    myType pVar = new myType(); 
    DoSomething(pVar); 
    delete pVar; 
} 
catch (exception) { 
    cout << "Doh! Something failed!" << endl; 
} 

在上述情況下,如果「DoSomething的()方法拋出異常時,PVAR永遠不會被刪除,所以將有內存泄漏

(解這個包含。 :在try/catch塊之前聲明所有變量,使用auto_ptr,或者只是避免try-catch開始!)

1

我很好奇爲什麼'PHP/Java'在這裏被認爲是單一的東西。 't。

  • Java-> C++轉換很大但是可行,你只需要學習很多額外的語法,一些額外的概念,比如析構函數,複製構造函數,對象切片和運算符重載,並且與C++圖書館。
  • 另一方面,PHP-> C++轉換的幅度更大一個數量級,因爲它涉及到(a)定義非常差的源語言,(b)基於模板的語言而不是基於類的語言,和(c)在特殊環境下執行的語言。
相關問題