2008-12-24 37 views
4

這是一個簡單的問題。當我從C&C#轉換到C++時,我可以期待什麼不同?

我已經做了大量的工作,使用C#編程語言(C#2.032),但從來沒有任何東西在C + +。學習C++時,我可以期待什麼不同?會有什麼大問題或障礙我應該關注嗎?有沒有人爲經驗豐富的程序員學習C++速成教程/網站建議?

回答

0

的bigest「障礙」將可能是你會負責釋放內存你分配

+0

他來自C背景,C++中的內存管理較少,而不是更多。 – gbjbaanb 2008-12-24 15:11:27

2

嗯......艱難的一個。如果你對.NET和指針還可以,那麼不應該有太多新的東西。

我認爲處理C++頭文件將是一種體驗。還有C++ STL可以讓你自己熟悉。

你也許不得不面對有人對你多次繼承等事情大吼大叫。

0

已經發布了,你可能會對你的內存管理負責,但其他的只是學習C++庫以及如何組織它們,我認爲它不應該是一個艱難的開關。

4

我強烈建議:「有效的C++和更有效的C++」。如果你在這裏,「有效的STL」可能有一些幫助:)

這些書是特別爲需要有效處理C++的智能程序員編寫的。我證明有效的C++是我開始使用C++的時候幫助我的那個人!

C++初學者的另一本好書(但我不認爲是電腦初學者)是「Accelerated C++」。它主要側重於良好的編碼,生成高級代碼,而不是關注細節。 (在本書的最後部分將詳細介紹)。

好運:)

3

嗯,我一直在使用C++,現在超過10年,所以我的答案是,學習嚴格的內存管理,C++模板,STL,然後升壓。這應該帶你幾個月,那麼細節問題將帶你說5年:)

至於書,我喜歡香草薩特的特殊C++和更出色的C++

+0

嗯......你每天都會學到新的東西。與普通C相比,C++中新的內存管理方面是什麼?我一直覺得這個討厭的東西已經在C了。 – biozinc 2008-12-24 12:44:54

+0

那麼開始你使用新/刪除,而不是malloc/free,接下來你有新的/刪除重載,然後你有實例分配器,類分配器,智能指針嘉豪,命名幾個明顯的 – 2008-12-24 12:50:03

+0

謝謝!現在,當我回到C++時,我知道更多要注意的事情。 – biozinc 2008-12-24 12:57:14

8

這裏有一些從我的觀點:

  • 指針在C++中發揮了很大的作用。 雖然在C#中只有參考 類型。你可能會從 指針錯誤中得到一些頭痛。您還必須手動管理內存分配 。並且 如果此 未正確完成,您的程序 可能會遇到內存泄漏。在C#中,每個 對象都被垃圾收集, 自動。
  • 的聲明和 類的定義通常在 頭文件(.h)中源文件 (的.cpp或.CC)分離。這首先會導致 有點混亂。
  • 與C#中一樣,C++中不會有如此多的基類 庫支持。例如,對於 示例,您不會在C++中內置類 HttpRequest
  • 因此,您將不得不使用一個 大量的外部庫,並知道如何處理.dll或.lib的 。
  • C++在C#中沒有Interface。你將使用抽象類(和 多重繼承)來代替。
  • C++中的字符串是char數組或 指向char的指針。
  • 有可供使用的一些算法和數據結構 在 標準模板Libary(STL)。但是 它需要時間來學習之前,你可以 開始有效地利用它:)

您還可以瞭解C++/CLI將.NET代碼和本地C++混合在一起,以獲得兩全其美的效果。

+1

你不想使用多重繼承... – Ilya 2008-12-24 13:18:31

0

關於語言實現的差異 - 我認爲你需要小心內存管理,頭文件中的聲明等。 - 我認爲最難處理的是額外的重載語法中的特殊字符。經過多年編寫C#代碼,我偶然發現的東西都是那些額外的*,&<>的腳步聲。我的第一反應是C++代碼看起來很像一個大的正則表達式。我敢肯定,一旦你使用它一段時間,這會消失,但我不再做足夠的C++來舒服,我確切地知道每種情況下使用哪個符號 - 我是否傳入一個指針或對該對象的引用?

無論如何,在閱讀其他人的代碼時,另一個大問題是操作符超載。我知道你可以用C#做​​,但我很少在那裏看到它。可能事情已經發生了變化,但我曾經在C++中看到很多運算符重載,其中+/-會帶來一些奇怪的效果。除了一些相當明顯的勝利(比如字符串連接)之外,我認爲這是一個非常令人懷疑的特性,我無法在C++和C#中完成。

2

我從Asm轉到了C,C++ ......和最近的C#。它能夠實例化對象,並從方法或屬性中返回它們。通常,實現和用戶代碼都不需要擔心釋放內存。此外,在大多數情況下,沒有理由返回狀態代碼,例如HRESULT,因爲如果出現問題,則會拋出異常並讓用戶代碼處理它,如果需要的話。

最近我回到本地C++代碼爲我的最後一個項目,我真的很想念垃圾收集和異常拋出。

但是,我喜歡C++的模板功能。 C#應該有一天會擴展這種技術。

0
  1. 內存管理
  2. 更復雜的語法
  3. 內存管理
  4. 減少刀具的支持比C#的整個生命週期的OOP。
  5. 內存管理

我有沒有提到內存管理?

我一直認爲使用市場作爲一部分人羣感知需求的指標很有意思。考慮到(爲了對比)VB市場,看起來組件庫是主要的重點。然而,從早期開始,C++(和C)市場上的主要產品似乎就是內存管理,泄漏檢測和代碼質量工具(例如類似皮棉的檢查器)。

1

我看到有人指出內存管理是個大問題,因爲你必須手工完成。那麼,不要相信他們,這是錯誤的。除非你處於一個充滿異國情調/舊式的環境,否則C++擁有的工具可以幫助我們隱式地和確定地管理內存(以及其他資源)。請參閱boost/std :: tr1 shared_ptr <>和RAII。

與GC收集的記憶有很大的區別:你必須自己照顧週期。

關於多重繼承,一旦你掌握了LSP的含義,它也不算什麼問題。

我會和pheze的消息,同意:加速C++是,如果你想教你如何C++能(/應注意什麼?)使用一本必讀書。

-3

類之間的循環引用[在C++中]。如果你問我,C++中的OOP實際上是一半。

編輯:好吧,所以更多的細節是爲了我想。假設你有: Foo班和Blah班。類Blah引用類Foo,類Foo引用類Blah。假設你去,你可以實現像這樣的天真路線:

#include <blah.h> 
class Foo { 
    Blah blah; 
    ... 
} 

和胡說:

#include <foo.h> 
class Blah { 
    Foo foo; 
    ... 
} 

這可能將無法正常工作。相反,你需要使用向前引用,即富變爲:

class Blah; 

class Foo { 
    Blah blah; 
    ... 
} 

如果你做了一些谷歌搜索「在C++中的循環引用」你會明白爲什麼我在這個問題提到它。現在停止投票我下來將是你...

14

我可以想到的主要區別是,C + +是遠遠超過C和C#的多範式語言。在C#中,OOP仍然是範例。這是一種OOP語言,如果你不做OOP,C#社區會告訴你你做錯了。 (雖然在過去的幾年中C#已經爲幾種功能性編程增加了很好的支持)。

在C++中,OOP被支持,當你感覺喜歡它時可以使用它,但所有的煩惱都圍繞着泛型編程。 C++模板允許各種各樣的聰明的,可重用的和通用的庫,並且實現與老式OOP相同的許多目標,但是沒有大的繼承層次結構,並且在類之間幾乎沒有耦合。標準庫包含此

在C++中,很多C構造的例子很多,但仍然是合法的,基本上都是避之唯恐不及:

  • 原始指針(通常與智能指針如boost::shared_ptrstd::auto_ptr更換,或在用戶代碼引用
  • 內存分配(通常應該被包裹在智能指針,或在一個特製的RAII對象)
  • 函數指針(通常與函子代替,更好的類型的安全性和PERFO rmance)
  • goto(經常用C來跳轉到清理代碼。同樣,受了RAII不必要的)
  • 預處理器(實際上是永遠需要的。不想,而不是模板)

當然,也有例外,這些點的每一個,但是作爲一般的經驗法則,C++與C代碼不同,代碼將幾乎消除所有這些使用。

和超過在C#中,類實際上馱馬做了很多繁重的工作。在C#中,一類是不是有點腳手架的多一點,容器堅持在所有的方法當然,它有一個構造函數,它可以實現的Dispose()。但C++採用了很多進一步的,你必須:

  • 構造函數(就像在C#中,初始化從頭類)
  • 拷貝構造函數(初始化類作爲另一個對象的副本)
  • 賦值運算符(因爲類是C#會考慮的值類型,所以賦值不僅僅是更改引用,而是以用戶定義的方式複製對象的所有內容)
  • 析構函數

析構函數可能是 C++中最重要的概念。對於RAII來說,至關重要的是內存或其他資源的管理方式,因爲當對象超出範圍時會自動調用它。這可以讓你的課程提供很多C或C#無法實現的保證。 例如,boost :: thread提供了一個作用域鎖,當它超出作用域時,可以保證被釋放,函數是否正常返回,拋出異常或其他。所以當使用這個庫時,用戶不必擔心釋放鎖或其他資源。只要你完成了它,它就會自動發生。

在某種意義上,這給你更多的鉤來定製你的類的行爲。與C#不同,您可以精確控制執行簡單分配時發生的情況。您可以控制類在超出作用域時發生的情況,從頭開始初始化或作爲另一個對象的副本進行初始化。這使得寫得很好的課程幾乎不可能錯誤地使用。 (幾乎)

除此之外,模板和模板元編程是你可能會碰到的概念。他們是非常強大的工具,因此請確保您與他們保持友好的關係。 :)

1

Jalf有它完全正確的 - 從C/C#背景的,實際上你已經知道了一切++你需要的基本的C,你知道OOP太多,所以你做的一樣好。

有兩件事情浮現在腦海中,這將是新的給你,但:

  • RAII:這可以讓你有自動內存管理,你不再需要記住釋放所有你的malloc。很酷啊!它也可以幫助所有其他資源,您不再需要記住關閉該套接字,文件,數據庫連接 - RAII爲您做。 C和C#都沒有。

  • STL/Boost:這是'C++類庫',它包含很多有用的實用程序和位。所有的標準容器都在STL中(像'字典','數組'和'列表')以及可以應用到它們的算法(例如,如果你有一個數據項列表,你可以提供一個小函數對象一個函子),然後傳遞給一個通用的算法,這真的很強大,你可以用它做很多工作)。

1

主要的不同是C++是基於值的,而C#是基於引用的。

在C#中,當你將一個對象傳遞給一個方法時,實際上你只是傳遞一個引用,所以調用方法和被調用方法都在查看同一個對象。

在C++中,當您將對象傳遞給方法時,會創建該對象的副本,並將整個副本傳遞給該方法。調用方法對副本所做的更改不會影響調用方法中的原始方法。可以使用參考語法在C++中模擬參考行爲:

void somemethod(someclass& obj);