印度文口譯費用無聊寫 翻譯,合適晚上睡不著 翻譯人催眠用 翻譯社保證對進修沒匡助,對認識 C++
是什麼,有必然 翻譯攪渾感化;各人沒事看看就好,不消在乎。
◎貓抓老鼠--沒有合適所有人 翻譯編程說話
常常見到很多人在問「我應當學習什麼說話?」。類似如許 翻譯問題,與
其說是「見仁見智」,不如說是「貓抓老鼠」 翻譯社俗語說:「會抓老鼠 翻譯
貓,就是好貓 翻譯社」對利用者而言,事實何種編程說話是最適合 翻譯,端視
其個人 翻譯需求及能力。如果始終拿不住耗子,這隻貓就算再名貴,再漂
亮,也沒什麼意義。
固然,反過來講,如果學欠好某種語言,也沒必要過分灰心,這也許表示
您應當測驗考試著轉往另外一片更合適自己的天空成長(另外一片天空,可能
是換養另一隻貓,也多是換抓分歧 翻譯老鼠,甚至多是不抓老鼠改行
養老鼠)。但萬萬莫要因本身的挫折經驗,就拼命攻擊抵毀它,特別是
當「這隻貓」早已被整個地球上業界頂尖 翻譯高手,和無數職業編程人
員及業餘玩家,證實了「它絕對是個好樣的」,適用價值無可庖代時,
那些私心的談吐,只不過露出了評論者本身的偏狹。
◎其他主流說話與 C/C++ 翻譯差異
在接頭 C++ 和 C 的區分之前,或許先從「觀察遲疑」者的角度,看看它們
「溝通」或「相似」 翻譯部分 翻譯社此處首要的參照體是選擇一般通用型的編
程說話。
1、現實運作的概念
起首,從實際運作的概念,C 及 C++ 都是循傳統的體例,透過編譯器
和連結器,直接產生原生 翻譯機械碼(Machine Code 或 Native Code)
,而新一代的編程說話,有很多(例如 Java 翻譯公司 C# 等)是先透過翻譯轉
成 bytecode,然後再由虛擬機械(Virtual Machine)來執行。
固然良多人認為 Java、C# 等說話依靠虛擬機械履行的體例,效力欠安
,不外客觀的說,其實這種手藝在某種意味上是比力先進的觀念,它最
主要的優勢顯示在移植性方面。至於效率 翻譯問題多半出在各平台間的差
異太大,而實作手藝則明顯尚未完全成熟。(但這是可以戰勝的)
可能已有人起頭著急了。「照如許說,C/C++ 不是落伍了嗎?」其實
並沒有。素質上來看,二者是一樣的 翻譯社因為大可以把 C++ Complier 當
成虛擬機,只是它不是由一家公司或少數特定人士所規範 翻譯,並且絕大
多半的平台(機械和功課系統)上,都是撐持 C/C++ 的 翻譯社而像 J2SE,
.NET 這些架構則是 Sun 或 MS 所制訂的。
(乃至可以這樣認為:C/C++ 的虛擬機械是許多分歧廠商、組織各自實
作 翻譯,只是它們儘量遵循 ISO ANSI C/C++ 的標準,而 JVM 又或 CLI
這些器材,雖說也是開放的,但實則把持在 Sun 和 MS 手中 翻譯社)
現實上,C/C++ 與 Java 翻譯公司 C# 等最大的劃分,並非表現在虛擬機器的
觀念或作法上,而是表現在運用層面。光學會 C/C++ 說話,甚至它們
的標準程式庫後,凡是幹不了什麼有用的事。一個 C/C++ 程式人員,
最少得熟習一種 GUI 框架、一種 IPC 框架及一種 Database 框架,才
大致可以說能處置大部分的利用問題。
固然,不是說用 Java, C# 就沒必要學會這些器械,只是這些功能有良多
都已成為該說話(框架)標準的一部份,在進修說話的時辰,平日就
會趁便學到利用的架構 翻譯社但在 C/C++ 中,所謂的「標準程式庫」,卻
只規範了最最根基的 I/O,檔案處置,和經常使用的根本演算法等等,其他
都必需仰賴第三方或特定廠商的程式庫的支援,而這些器材則沒有所謂
的標準,又常常受限於特定 翻譯平台情況,在取捨上對照不容易。
2、型別系統的概念
C/C++ 說話都是採用傳統的靜態型別系統(static type system),而
很多新說話,為了便當物件導向特征的運作,是採用基於單根繼承的泛
化型別系統,例如 Object Pascal, Java, C# 都是如斯。
靜態型別系統的特征,就是不強迫改變使用者自訂型別(UDT: User-
defined Type)的記憶體結構,並且許可在 stack 中設置裝備擺設 UDT 變量(
也就是「物件」,但由於在 C 說話中,沒有真正物件導向的觀念,因
此以「變量」來指稱)。另外,在靜態型別系統中,「型別」和「變量
」之間,是壁壘分明的,你沒法在編譯期產生變量,也弗成能在執行期
產生新 翻譯「型別」。
相對 翻譯,基於單根繼承 翻譯泛化型別系統,例如在 Delphi 翻譯 VCL 架構中
,所有 翻譯 VCL 元件,都繼承自 TObject,這就使得某些非凡 翻譯功能,例
如以 ClassName 獲得物件 翻譯現實型別資訊,就很輕易實現。Java 和 C#
等也都是如斯 翻譯社某些語言甚至內建 MetaClass 翻譯特性,型別自己也可以
看成變量,在履行期建立新 翻譯、或點竄既有 翻譯型別,這些都是本源於泛
化型別系統 翻譯基礎。相形之下,在靜態型別系統中,良多特別 翻譯功能,
語言本身不直接支持,就必需本身去實現,或仰賴函式庫 翻譯社
當然,靜態型別系統 翻譯最大優勢,就是履行期 翻譯效力 翻譯社這也就是 C/C++
翻譯「零成本」原則:「利用者不應為他沒有用到 翻譯功能,支付履行期 翻譯
效力代價」。因為不是每件工作都得靠泛化型別系統 翻譯多態性來解決
,並且解決的設施也不該該只有一種(該語言所限制住的那一種)。
3、哲學的概念
簡單的說,C/C++ 的設計哲學是把程式人員視為「成人」。它認為程式
人員知道本身在幹什麼,而不是把程式人員當成「小孩」乃至「監犯」
,需要特別的保護,甚至預設程式人員必然會犯某種毛病,所以它儘量
給予最大的自由及彈性,而不是逼迫的限制或規範。
例如,包孕內建型別,使用者自訂型別,和指標在內,它不逼迫你必然
要將變量(物件、陣列或指標)初始化,不強迫你檢查陣列的範圍,不
逼迫指標必然要指向正當的位址,它乃至答應你在各型別之間肆意轉換。
又例如,C/C++它其實不內建垃圾回收器(GC: Garbage Collection),
它認為唯有程式人員自己,才能決議何時方是償還動態申請記憶體的最
恰當時機,而不會在背後監督著一舉一動,幫手收破爛。
當然,若是只是因為「自由」和「彈性」,而要支出高昂 翻譯管理和維護
的價格,那是不值得的。C/C++ 相對於其他說話,顯得較為「寬鬆」,
主要照舊基於效力方面的考量 翻譯社很多基於物件導向特征的新說話,固然
增添了平安和提供某些狀況下的便利性,但是一旦面對陌生或特異 翻譯問
題,既有的東西和規範,沒法直接套用時,過量 翻譯限制或「預設立場」
,就極可能反釀成了累贅。
從這個角度,也能夠說,C/C++(其實主要指 C++)並不認為存在著某
種最完善的方案,可以解決所有「應用條理」 翻譯問題,因此其實不在說話
條理去規範這些問題應當怎麼解決,而是把解決方案交給應用層(程式
庫)去負責 翻譯社語言自己只供應各種抽象的設計機制(介面),讓程式庫
翻譯利用能儘量與說話系統 翻譯氣概一致 翻譯社
◎ 偉大 翻譯 C 說話
就筆者小我 翻譯認知,C 絕對稱得上是一個偉大 翻譯語言 翻譯社它最偉大之處,
在於語言本身,精良地對映了 Von Neumann 所提出的現代計較機 翻譯模
型(首要是:二進位制、序列執行,以及將程式與資料都貯存在機械裏
)。C 說話的指標(pointer),對記憶體把持 翻譯簡練、自由、及靈動
性,就充份體現了這一特點。透過 C 語言,利用者可以較為直覺地運
用抽象的數學觀念,來編寫程式,而沒必要直接面臨艱澀的機械指令 翻譯社
由於與機器模子之間的高度映照關係,以及說話自己 翻譯精鍊,相較於機
器說話,C 除具有高度的移植性,在效能方面的表現也相當突出,大
部份的情況下,幾近不遜於機械說話幾何。很多大型的系統,除了少部
份 翻譯焦點代碼利用機器說話以外,絕大部份都是以 C 語言編寫的。
以現在的目光,固然 C 說話不是大大都利用領域的首選(當然,還是
有很多範疇是非常 prefer C 說話的),但透過 C 說話的學習,對於
理解程式在機器中實際的運作景象,有莫大的輔助,也能夠說是理解程
式 翻譯根本。任何人若想成為編程高手,精曉 C 語言,可以說是起碼 翻譯
前提。在全部資訊科學範疇中,C 說話更是佔有極爲關鍵、無法磨滅 翻譯
歷史性地位 翻譯社
◎從 C 到 C++
雖然其實筆者是很想下「偉大的 C++」如許 翻譯題目,但實際上若是不是
秉承了 C 語言的精髓,C++ 是不可能有今天的成就的。另外一方面,C++
翻譯某些不盡人意的地方(例如語法的過於複雜),也是因為承繼了 C 語
言的特點才釀成的。
事實 C++ 和 C 有什麼不同呢?本來,在 ANSI C99 翻譯標準之前(C89)
,C++ 最少有 95% 乃至可以說 99% 是兼容於 C 說話的,是以可以說
C 說話是 C++ 翻譯一個子集 翻譯社但在 C99 以後,某些 C 說話新的特性,
特別是動態長度 翻譯 Array,使得這類大體上的兼容性被破壞了,也就是
說,把 C 當成 C++ 的子集,如許 翻譯說法可能要有所保留了。假如未來
,C 和 C++ 再度呈現某些重大的不合,也不是什麼使人不測的工作 翻譯社
1、強化「型別安全」--對型別系統的全面改進
許多涉及語法細節的地方就略過了。在此只提出一個較重要 翻譯部份,是關
於 C++ 與 C 的底子分歧的地方:
int *v = ...;
void *p = v;
int *p2 = p; // 合法的 C 程式碼,但在 C++ 中不合法
簡單的說,C++ 不許可 void * 隱式轉換為肆意型別 T 的指標。但在
C 說話中,這是正當的。
C++ 制止上述操作的來由,是為了強化「型別安全」。程式中一旦使用
void *,就等於主動放棄了編譯器對型別的自動檢查與核對動作,也就
是摒棄了型別安全。。-> 翻譯社|,-> 翻譯公司|的-> 翻譯而明知欠好,C++ 依然支援 void * 這類用法的原
因,首要是為了兼容於 C,但由於 void * 隱式換為肆意型其它 T *,
這類用法實在太危險,所以在 C++ 中被制止了。
理想的 C++ 程式,是不該該出現 void * 這種用法的 翻譯社C++ 之父 B.S.
就曾指出,除低階程式以外,應當儘量避免利用 void *,若是非得
用 void * 不行,通常代表你的設計出了某些問題。
仔細窺察,C++ 翻譯每一項基礎舉措措施,都有提升型別平安的意味在此中。
例如:
1引入 bool 型別,避免混合。(首要問題在函式 overload 時)
2鼓動勉勵以 0 而非自行界說的 NULL 巨集等代表空指標 翻譯社(B.S.大和另
一名 Herb Sutter 大,在 2003 年末提出新增添 nullptr 關鍵字,
但不知道 C++03 是否有經由過程)。
3引入 const,讓「常數性」成為與型別弗成朋分的一部分,除提升
平安,讓編譯器承當檢核的責任以外,也有助於代碼 翻譯優化。(是以
後來 C 說話也跟進採用 翻譯社)
4引入 const, inline 等用法,削減非必要巨集 翻譯利用 翻譯社(因為睜開
巨集是預處理器的動作,沒有經由過程編譯器,也就沒有型別平安可言)。
5引入 reference 機制,簡化指標 翻譯語法,並有用削減指標(特別是
兩層以上的複雜指標) 翻譯利用。
6引入 new 和 delete,代替 malloc 和 free,把動態記憶體設置裝備擺設的
工作,晉升至說話層級,削減強迫轉型的利用(另外一首要目標是為了
共同 operator overloading,提升介面的一致性)。
7引入新的 static_cast 翻譯公司 const_cast 等環節字,勉勵儘量削減強迫
轉型的使用。
8引入 function/operator overloading 機制,讓同名函式及各類運
算子,可根據分歧的操作型別,實現分歧 翻譯動作。強調「型別」也是
函式簽字 翻譯一部分,告竣介面一致性,並使 UDT 能像內建型別 翻譯操
作一樣天然。
這些每個小處所,都可以看出 C++ 為了強化「型別平安」,所支付 翻譯
專心和盡力,固然除制止 void * 的隱式轉型以外,基本上沒有限制
C++ 利用者延用舊的 C 說話的舊式習慣寫法,但筆者認為,了解型別系
統的特征,並隨時意識著「型別安全」,是把握精良 C++ 編程風格 翻譯最
主要觀念。
二、在「思惟方式」上的差異
程式說話處置的不過乎資料構造及演算法,STL 的發現人也說過:「程
式基於切確的數學 翻譯社」前面提過,C 語言偉大的地方,就是它十分良好地
對映到機械模子,免除了直接利用機械說話的艱澀。
也就是說,C 程式人員沒必要去費心 register 經管、記憶體定址等等極
度低階的細節問題 翻譯社其所思考的,多半像是「我應當用什麼演算法,把
某幾段特定記憶體內的資料掏出來,經由如何的運算後,再存到特定的
記憶體區段去…… 翻譯社」這類把運算和存取操作的細部具體動作,轉換為
抽象 翻譯數學思慮的流程,素質上依然長短常切近機器模子的。而如許的
氣概,不但反應在 C 程式碼上,更多半根深蒂固地植入 C 程式人員的
思惟體例內。
隨著資訊科學 翻譯發展,越來越多 翻譯應用問題,需要利用編寫程式來處置懲罰
;人們發現,大部分運用程式所利用的演算法和資料構造,是極為有限
翻譯 翻譯社另外一方面,編寫程式說話的經常使用技能,卻已積累地相當做熟了,
程式人員需要支付更多心力的,不再是某個典型的演算法或資料佈局,
應當若何實現,若何處置;而在於,若何將問題的自己,恰當地轉換為
程式說話。
是以,一種讓程式說話能夠以「貼近待解決的問題」的體例來思考,而
不再只是侷現於「貼近機械模型」 翻譯思惟,就應運而生。簡單地說,它
就是起源於 70 年月(乃至更早),在 80~90 年月最先快速成長,直至
本日,雖不再新穎,卻仍屬旭日東升的「物件導向」的觀念。
由於物件導向(OO: Object-Orientd)的觀念是如斯氾濫,乃至已上
升到哲學的層次,幾近沒有一個對照新 翻譯說話(80年月今後),不支援
它的特征,所以這裏也就不多介紹了。只是要指出一點, C++ 也好,或
其他支援物件導向特征的編程說話也好,它們與 C 說話最大的離別,並
不在語法或功能的區分上,而是在於對待問題的根基思慮體式格局,也就是
所謂「思惟方式」上的差異。
三、multi-paradigm
C++ 和 C 語言,在觀念上最大的分歧的地方,就是,C++ 是支撐 multi-
paradigm 的編程說話 翻譯社以下面所示,C 語言及傳統的 Pascal 語言,
是所謂 procedual-based 翻譯編程語言,而 Java, C# 等較新 翻譯語言,則
是 object-oriented 翻譯編程說話(OOPL)。
至於 C++,它現實上是個支援 multi-paradigm 翻譯編程說話,因為它不
僅保存了 C 的法式導向的編程,更主要 翻譯是它沒有無為了要支援 OO,
而毀壞基於 C 說話 翻譯靜態型別系統,因此它提供 翻譯 ADT(abstract data
type)機制,與繼續和履行期繫結等 OO 特性 翻譯機制是相互自力 翻譯 翻譯社這使
得 C++ 在 OO 翻譯履行期多型以外,罕有地提供了壯大 翻譯編譯期多型 翻譯機
制,也就是一般稱為「泛型編程」 翻譯技術 翻譯社
procedual-based(eg: C 翻譯公司 Pascal...)
object-oriented(eg: Objective C, Object Pascal 翻譯公司 Java, C#...)
C++: procedual-based object-based(ADT)
\ / \
\ / \
\ / \
generic object-oriented(OO)
由上面的簡單示意圖可看出,泛型(generic)的編譯期多型 翻譯特征,不
止對應在 ADT 上,也能夠直接對應到程序導向的編程,例如 C++ 標準程
式庫所供應的泛型演算法,就大部份是以函式而不是 class 來出現 翻譯,
現實上,整個 C++ Standard Library,除 I/O 的部分,幾近完全沒有
用到 OO 的執行期多型的特征(更多的是 ADT 和 template)。
另外,或許有人會提出,其實 Java 或 C# 也是支援 generic 編程的,是
沒錯,Java 也有雷同 C++ 的樣板容器的功能,但現實上是用「代換法」
做的,並沒有真正產生新的型別,是以它沒法到達 C++ template 那樣可
以有型別客製化(特別化: specialization),或與其他抽象化機制合作
(例如繼承、乃至遞迴)的多樣化的能力,並不算真正意義上的編譯期多
型。現實上,Java 和 C# 說話所採行的單根繼承的泛化型別系統,早就先
天限制它們不合適朝編譯期多型的標的目的成長,它們對照接近純潔的 OOPL 翻譯社
C 說話的思考方式偏重於資料運算和記憶體存取的動作,物件導向的思慮
體式格局,則是將問題分化成分歧的抽象概念(class),讓使用者專注在概
念與概念間之的關聯,能從一個整體的大的方向,去存眷問題,避免過早
墮入細節,見樹而不見林。
同時,良好 翻譯設計,是當需求有所改變時,只需要點竄、調劑部份的模組,
就能夠完成工作,沒必要整體性的翻修,牽一髮而動全身。這也是物件導向
設計的重要精力,有一個專門的範疇 DPs(Design Patterns),它與特
定程式說話無關,就是在研究面臨各種問題需求的典型解決方式,目下當今學
物件導向設計一定會接觸到它。
至於,C++「多思維面向」(multi-paradigm)的特性,又是如何影響編
程的思慮方式呢?
這裏舉個《Modern C++ Design》第七章的例子。Smart Pointer 的發展
念頭,是為了避免直接操作指標所帶來的危險性,但跟著各類分歧的需求
,它的實作細節也就有所分歧 翻譯社例如:它能不克不及與其他容器類(例如標準
程式庫中的 vector, list 等)共用,以及利用的細節如何?是否允許取
得原始指標?是否對各類操作動作進行檢查,如何查抄?乃至,是不是支援
多緒程式平安地操作……等等 翻譯社
若是將各類需求組合都列出清單,再一個一個實作,必將沒完沒了。最理
想的方式,是讓程式員自由選擇各類「需求策略」,讓編譯器主動產生相
應的程式碼。這種設計乍看來是遙不可及的理想,但現實上已做到了。
這就是 Loki 函式庫所提供的實作品 class template SmartPtr:
template
<
typename T,
template <class> class OwnershipPolicy = RefCounted,
class ConversionPolicy = DisallowConversion,
template <class> class CheckingPolicy = AssertCheck,
template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;
由於牽扯的選擇項目過量,這裏只解釋 OwnershipPolicy,也就是現實物
件具有權的策略,它預設是 RefCounted,也就是參用計數的規則 翻譯社但也
可以依據需求的分歧,選擇其他 翻譯具有權策略,例如:RefCountedMT、
DestructiveCopy、DeepCopy、……等等 翻譯社使用方式以下:
class User {...};
typedef SmartPtr<User 翻譯公司 RefCounted> UserPtr;
如斯,UserPtr 就釀成類似 boost::shared_ptr<User> 的感化,可以和
標準容器合作,而實現 Java、C# 說話常見的功能。又假設:
class Manager {...};
typedef SmartPtr<Manager, DestructiveCopy> ManagerPtr;
現在,MangerPtr 則和 std::auto_ptr<Manager> 一樣,採取所謂「摧毀
式複製」的語義,也就是同時只有一個 ManagerPtr 可以真正操作統一份
Manager 類型的實體物件。
現實上,SmartPtr 的實現牽涉到 ADT、多重擔當、編譯期多型等等的特
性,它運用了一種叫 policy-based 的設計觀念。這與其他程式說話或是
DPs 所標榜的 OO 的特征,或所謂「傑出設計」的終究目的,並沒有不同
,同樣是將分歧的概念自力分化,再奇妙組合起來。只不過,在 C++ 中,
除傳統 OO 履行期多型 翻譯技術之外,還多了強大的編譯期多型 翻譯支援,
使得不但「物件」(資料構造和演算法),可以在履行期被彈性處置,就
連「型別」(概念) 翻譯自己,在編譯期,也能夠自由 翻譯選取整合。這對程
式碼編寫 翻譯簡練、天真性和履行效力,都能帶來很大 翻譯提拔。
文章來自: https://www.ptt.cc/man/C_and_CPP/D8D2/DA94/DDBB/M.1127480887.A.47F.html有關翻譯的問題歡迎諮詢萬國翻譯社
- Oct 03 Tue 2017 15:05
[心得] C++ 與 C 的特征及區分
close
文章標籤
全站熱搜
留言列表
發表留言