這是一個簡單的問題。當我從C&C#轉換到C++時,我可以期待什麼不同?
我已經做了大量的工作,使用C#編程語言(C#2.032),但從來沒有任何東西在C + +。學習C++時,我可以期待什麼不同?會有什麼大問題或障礙我應該關注嗎?有沒有人爲經驗豐富的程序員學習C++速成教程/網站建議?
這是一個簡單的問題。當我從C&C#轉換到C++時,我可以期待什麼不同?
我已經做了大量的工作,使用C#編程語言(C#2.032),但從來沒有任何東西在C + +。學習C++時,我可以期待什麼不同?會有什麼大問題或障礙我應該關注嗎?有沒有人爲經驗豐富的程序員學習C++速成教程/網站建議?
的bigest「障礙」將可能是你會負責釋放內存你分配
嗯......艱難的一個。如果你對.NET和指針還可以,那麼不應該有太多新的東西。
我認爲處理C++頭文件將是一種體驗。還有C++ STL可以讓你自己熟悉。
你也許不得不面對有人對你多次繼承等事情大吼大叫。
已經發布了,你可能會對你的內存管理負責,但其他的只是學習C++庫以及如何組織它們,我認爲它不應該是一個艱難的開關。
我強烈建議:「有效的C++和更有效的C++」。如果你在這裏,「有效的STL」可能有一些幫助:)
這些書是特別爲需要有效處理C++的智能程序員編寫的。我證明有效的C++是我開始使用C++的時候幫助我的那個人!
C++初學者的另一本好書(但我不認爲是電腦初學者)是「Accelerated C++」。它主要側重於良好的編碼,生成高級代碼,而不是關注細節。 (在本書的最後部分將詳細介紹)。
好運:)
嗯,我一直在使用C++,現在超過10年,所以我的答案是,學習嚴格的內存管理,C++模板,STL,然後升壓。這應該帶你幾個月,那麼細節問題將帶你說5年:)
至於書,我喜歡香草薩特的特殊C++和更出色的C++
這裏有一些從我的觀點:
HttpRequest
。Interface
。你將使用抽象類(和 多重繼承)來代替。您還可以瞭解C++/CLI將.NET代碼和本地C++混合在一起,以獲得兩全其美的效果。
你不想使用多重繼承... – Ilya 2008-12-24 13:18:31
關於語言實現的差異 - 我認爲你需要小心內存管理,頭文件中的聲明等。 - 我認爲最難處理的是額外的重載語法中的特殊字符。經過多年編寫C#代碼,我偶然發現的東西都是那些額外的*
,&
和<>
的腳步聲。我的第一反應是C++代碼看起來很像一個大的正則表達式。我敢肯定,一旦你使用它一段時間,這會消失,但我不再做足夠的C++來舒服,我確切地知道每種情況下使用哪個符號 - 我是否傳入一個指針或對該對象的引用?
無論如何,在閱讀其他人的代碼時,另一個大問題是操作符超載。我知道你可以用C#做,但我很少在那裏看到它。可能事情已經發生了變化,但我曾經在C++中看到很多運算符重載,其中+/-
會帶來一些奇怪的效果。除了一些相當明顯的勝利(比如字符串連接)之外,我認爲這是一個非常令人懷疑的特性,我無法在C++和C#中完成。
我從Asm轉到了C,C++ ......和最近的C#。它能夠實例化對象,並從方法或屬性中返回它們。通常,實現和用戶代碼都不需要擔心釋放內存。此外,在大多數情況下,沒有理由返回狀態代碼,例如HRESULT,因爲如果出現問題,則會拋出異常並讓用戶代碼處理它,如果需要的話。
最近我回到本地C++代碼爲我的最後一個項目,我真的很想念垃圾收集和異常拋出。
但是,我喜歡C++的模板功能。 C#應該有一天會擴展這種技術。
我有沒有提到內存管理?
我一直認爲使用市場作爲一部分人羣感知需求的指標很有意思。考慮到(爲了對比)VB市場,看起來組件庫是主要的重點。然而,從早期開始,C++(和C)市場上的主要產品似乎就是內存管理,泄漏檢測和代碼質量工具(例如類似皮棉的檢查器)。
我看到有人指出內存管理是個大問題,因爲你必須手工完成。那麼,不要相信他們,這是錯誤的。除非你處於一個充滿異國情調/舊式的環境,否則C++擁有的工具可以幫助我們隱式地和確定地管理內存(以及其他資源)。請參閱boost/std :: tr1 shared_ptr <>和RAII。
與GC收集的記憶有很大的區別:你必須自己照顧週期。
關於多重繼承,一旦你掌握了LSP的含義,它也不算什麼問題。
我會和pheze的消息,同意:加速C++是,如果你想教你如何C++能(/應注意什麼?)使用一本必讀書。
類之間的循環引用[在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++中的循環引用」你會明白爲什麼我在這個問題提到它。現在停止投票我下來將是你...
我可以想到的主要區別是,C + +是遠遠超過C和C#的多範式語言。在C#中,OOP仍然是範例。這是一種OOP語言,如果你不做OOP,C#社區會告訴你你做錯了。 (雖然在過去的幾年中C#已經爲幾種功能性編程增加了很好的支持)。
在C++中,OOP被支持,當你感覺喜歡它時可以使用它,但所有的煩惱都圍繞着泛型編程。 C++模板允許各種各樣的聰明的,可重用的和通用的庫,並且實現與老式OOP相同的許多目標,但是沒有大的繼承層次結構,並且在類之間幾乎沒有耦合。標準庫包含此
在C++中,很多C構造的例子很多,但仍然是合法的,基本上都是避之唯恐不及:
boost::shared_ptr
或std::auto_ptr
更換,或在用戶代碼引用當然,也有例外,這些點的每一個,但是作爲一般的經驗法則,C++與C代碼不同,代碼將幾乎消除所有這些使用。
和超過在C#中,類實際上馱馬做了很多繁重的工作。在C#中,一類是不是有點腳手架的多一點,容器堅持在所有的方法當然,它有一個構造函數,它可以實現的Dispose()。但C++採用了很多進一步的,你必須:
析構函數可能是 C++中最重要的概念。對於RAII來說,至關重要的是內存或其他資源的管理方式,因爲當對象超出範圍時會自動調用它。這可以讓你的課程提供很多C或C#無法實現的保證。 例如,boost :: thread提供了一個作用域鎖,當它超出作用域時,可以保證被釋放,函數是否正常返回,拋出異常或其他。所以當使用這個庫時,用戶不必擔心釋放鎖或其他資源。只要你完成了它,它就會自動發生。
在某種意義上,這給你更多的鉤來定製你的類的行爲。與C#不同,您可以精確控制執行簡單分配時發生的情況。您可以控制類在超出作用域時發生的情況,從頭開始初始化或作爲另一個對象的副本進行初始化。這使得寫得很好的課程幾乎不可能錯誤地使用。 (幾乎)
除此之外,模板和模板元編程是你可能會碰到的概念。他們是非常強大的工具,因此請確保您與他們保持友好的關係。 :)
Jalf有它完全正確的 - 從C/C#背景的,實際上你已經知道了一切++你需要的基本的C,你知道OOP太多,所以你做的一樣好。
有兩件事情浮現在腦海中,這將是新的給你,但:
RAII:這可以讓你有自動內存管理,你不再需要記住釋放所有你的malloc。很酷啊!它也可以幫助所有其他資源,您不再需要記住關閉該套接字,文件,數據庫連接 - RAII爲您做。 C和C#都沒有。
STL/Boost:這是'C++類庫',它包含很多有用的實用程序和位。所有的標準容器都在STL中(像'字典','數組'和'列表')以及可以應用到它們的算法(例如,如果你有一個數據項列表,你可以提供一個小函數對象一個函子),然後傳遞給一個通用的算法,這真的很強大,你可以用它做很多工作)。
主要的不同是C++是基於值的,而C#是基於引用的。
在C#中,當你將一個對象傳遞給一個方法時,實際上你只是傳遞一個引用,所以調用方法和被調用方法都在查看同一個對象。
在C++中,當您將對象傳遞給方法時,會創建該對象的副本,並將整個副本傳遞給該方法。調用方法對副本所做的更改不會影響調用方法中的原始方法。可以使用參考語法在C++中模擬參考行爲:
void somemethod(someclass& obj);
他來自C背景,C++中的內存管理較少,而不是更多。 – gbjbaanb 2008-12-24 15:11:27