亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

簡(jiǎn)述C++的復(fù)雜性

 更新時(shí)間:2020年08月21日 09:42:53   作者:Dabelv  
這篇文章主要介紹了簡(jiǎn)述C++的復(fù)雜性,幫助大家更好的理解和認(rèn)識(shí)c++編程語言,感興趣的朋友可以了解下

1. C++真的很復(fù)雜嗎

這個(gè)問題的答案是肯定的。從C++語言本身的發(fā)展和組成來看,C++語言并不是一種單一、“純粹”的編程語言,他有著復(fù)雜的內(nèi)部結(jié)構(gòu)。

最初,C++僅僅是在C的基礎(chǔ)上附加了一些object-oriented(面向?qū)ο螅┑奶匦?。C++最初的名字是“C with Class”。以后C++不斷的創(chuàng)新和發(fā)展,融入了procedural(過程化),object-oriented(面向?qū)ο螅?,functional(函數(shù)化),generic(泛型)以及metaprogramming(元編程)特性。這些能力和彈性使C++成為強(qiáng)大而又復(fù)雜的工具。

面對(duì)如此復(fù)雜強(qiáng)悍的編程語言,我們?cè)撊绾卫斫馑蛯W(xué)習(xí)它呢?最簡(jiǎn)單的方法就是將C++視為一個(gè)由相關(guān)子語言組成的聯(lián)合體。在每一個(gè)特定的子語言中,它的特性趨向于直截了當(dāng),簡(jiǎn)單易記。但當(dāng)你從一個(gè)子語言跳轉(zhuǎn)到另一個(gè)子語言的時(shí)候,它的規(guī)則就會(huì)發(fā)生變化。C++的子語言有4個(gè)。

(1)C

歸根結(jié)底,C++仍然是基于C的。blocks(模塊)、statements(語句、preprocessor(預(yù)處理器)、built-in data types(內(nèi)建數(shù)據(jù)類型)、arrays(數(shù)組)、pointers(指針)等,全都是來自于C。在很多方面,C++提出了比相應(yīng)C版本更高級(jí)的解決問題的方法,例如內(nèi)聯(lián)函數(shù)、引用、函數(shù)和操作符重載等。這些特性能夠和傳統(tǒng)的C很好地結(jié)合在一起,可以視對(duì)C的擴(kuò)充體現(xiàn)了C++的“A better C”的初衷。

(2)Object-Oriented C++

面向?qū)ο蟮腃++就是C with Classes涉及到的全部:classes(類)、encapsulation(封裝)、inheritance(繼承)、polymorphism(多態(tài))、virtual functions(虛函數(shù))等。C++這一部分直接用于object-oriented design(面向?qū)ο笤O(shè)計(jì))的經(jīng)典規(guī)則。

(3)Template C++

這是C++ generic programming(泛型編程)部分,大多數(shù)程序員對(duì)此缺乏經(jīng)驗(yàn)。Template(模板)的考慮已遍及C++,而且好的編程規(guī)則中包含特殊的template-only(模板專用)條款已經(jīng)不再不同尋常。實(shí)際上,tempalate(功能)極為強(qiáng)大,它提供了一種全新的programming paradigm(編程范式)——template metaprogramming(TMP,模板元編程)。

(4)STL(Standard Template Library,標(biāo)準(zhǔn)模板庫)

STL是個(gè)template程序庫,看名稱就知道,但它是非常特殊的一個(gè)。它對(duì)容器(container)、迭代器(iterator)、算法(algorithm)以及函數(shù)對(duì)象(function objects)的規(guī)約有極佳的緊密配合與協(xié)調(diào)。但是templates即程序庫也可以以其他的方式建立起來。STL有很多獨(dú)特的處理方法,使用STL編程時(shí),需要遵循它的規(guī)則。

C++的四種子語言(sublanguages)緊密地結(jié)合在一起,但它們的確又有各自鮮明的風(fēng)格。當(dāng)從一種子語言轉(zhuǎn)到另一種時(shí),為了搞笑編程時(shí)需要改變編程的策略,這是C++程序員可能遇到的情形,對(duì)此必須有心里準(zhǔn)備。例如,使用built-in(內(nèi)建)類型時(shí),pass-by-value(傳值)通常比pass-by-reference(傳引用)更高效。但當(dāng)從C++的C部分轉(zhuǎn)移到Object-Oriented C++(面向?qū)ο驝++),由于傳值傳值調(diào)用會(huì)導(dǎo)致建立參數(shù)的副本,調(diào)用用戶自定義的構(gòu)造函數(shù)和析構(gòu)函數(shù)會(huì)降低效率,所以更好的做法是傳const引用。在Template C++中工作時(shí),這一點(diǎn)更加重要。因?yàn)樵谶@種情況下,你甚至不知道你的操作涉及到的對(duì)象的類型。然而,當(dāng)你進(jìn)入STL,由于iterator(迭代器)和function objects(函數(shù)對(duì)象)以C的pointers(指針)為原型塑造出來的,所以對(duì)STL的迭代器和函數(shù)對(duì)象而言,舊式的C中的pass-by-value(傳值)規(guī)則又重新生效。

因此,C++不是使用一套規(guī)則的單一語言,而是由上面四個(gè)子語言組成的聯(lián)邦語言。每一種都有自己的規(guī)則。有了這樣的理解,就能更清楚地了解C++的內(nèi)部結(jié)構(gòu),并能根據(jù)不同的應(yīng)用需求使用不同的子語言,充分發(fā)揮C++語言的長(zhǎng)處。

C++的的復(fù)雜性可以體現(xiàn)在以下三個(gè)方面:

(1)學(xué)習(xí)周期長(zhǎng)。C++由于其內(nèi)在的復(fù)雜機(jī)制,要想成為一名合格的C++程序員,業(yè)界的規(guī)律是3到5年。

(2)開發(fā)效率低。主要是歷史原因,C++諸多庫都停留在“很低”的層次上,使用的便利性無法與RAD工具(Rapid Application Develop,快速應(yīng)用開發(fā))相提并論。有人提議將C++庫的層次提高,但是這是一件非??嚯y的工作,原因是這與C++語言的設(shè)計(jì)理念是有沖突的,C++希望最大限度地保持通用性和底層性。

(3)容易犯錯(cuò),維護(hù)難度大。C++是一種功能強(qiáng)大且自由度極大的語言,使用C++的過程中一不小心就犯下錯(cuò)誤,留下代碼漏洞,特別對(duì)于初學(xué)者,要能夠自如高效的使用C++語言需要很長(zhǎng)時(shí)間的磨練。

2. C++語言復(fù)雜的原因

C++復(fù)雜的真正原因是什么?對(duì)此,仁者見仁智者見智。因?yàn)槭菍W(xué)院派的東西嗎?不,學(xué)院派的出來的東西就一定復(fù)雜嗎?這個(gè)理由站不住腳。

經(jīng)歷三十多年的發(fā)展,C++的觸角已經(jīng)遍及了當(dāng)今世界學(xué)術(shù)、工業(yè)界的方方面面,體積雖然龐大,但結(jié)構(gòu)卻很清晰,C++并不因此而復(fù)雜。

C++是因?yàn)橹С值木幊谭妒教嗔藛??也不是,新生的語言幾乎都在走C++的成功范式,Python和Ruby等新型動(dòng)態(tài)語言的范式甚至更多,然而它們卻以簡(jiǎn)單和開發(fā)效率高而著稱、其實(shí)C++正真復(fù)雜的原因在于,堅(jiān)守三大原則決不妥協(xié)。一是對(duì)C的完全兼容,而是靜態(tài)類型檢查,三是最高性能。而其中最高性能又是這三大原則中的重點(diǎn)。既要發(fā)展新的特性,同時(shí)又要保持最高的性能,這是C++語言復(fù)雜性的根本原因。

C++沒有采用一些可能會(huì)降低程序性能的做法,如采用來及回收機(jī)制等。而這些做法是有可能降低C++的復(fù)雜性的。Bjarne Stroustrup教授(C++之父)在多種場(chǎng)合下表示,對(duì)C++的設(shè)計(jì)沒有大的后悔支出,原因在于對(duì)三大原則的堅(jiān)持首先是正確的,然后,若堅(jiān)守三大原則,即使重新設(shè)計(jì)一遍C++,結(jié)果也與今日相差不遠(yuǎn)。

3.需要學(xué)習(xí)和使用C++嗎

既然C++如此復(fù)雜,那么有必要學(xué)習(xí)和使用C++嗎?

對(duì)于這個(gè)問題,無法給出強(qiáng)制性的回答。在這個(gè)世界上,一定存在從來不用C++編程能夠出色完成特定編碼工作的程序員,也許他們所使用的語言就是Java、C#或者其他的編程語言。但是,我的建議是需要就用,不需要就不用學(xué)。但是,C++是一門優(yōu)秀且值得學(xué)習(xí)的語言。原因是C++具有如下特性。

(1)C++是一門貫通低級(jí)到高級(jí)的語言

C++語言向下兼容C語言,能夠直接通計(jì)算機(jī)的硬件和底層打交道,甚至能夠直接使用內(nèi)聯(lián)匯編。向上,C++語言是4中子語言的而結(jié)合體,它所能支持的特性的豐富程度也是其他語言所難以企及的。對(duì)于一個(gè)能夠靜下心來,能夠持續(xù)持續(xù)不斷努力提升自己對(duì)計(jì)算機(jī)系統(tǒng)理解程度(計(jì)算機(jī)體系結(jié)構(gòu)、硬件、操作系統(tǒng)、應(yīng)用開發(fā)、軟件項(xiàng)目和過程管理)的程序員來說,C++語言是一個(gè)絕佳的選擇。

(2)C++是一種高效的語言

C++程序的執(zhí)行效率與C語言相當(dāng),同時(shí)又提供了諸多的高級(jí)特性。這樣,C++語言為程序員創(chuàng)造了這樣一種可能:在利用各種高級(jí)特性(面向?qū)ο蠓椒?、泛型編程等)充分表達(dá)設(shè)計(jì)思想、解決各種復(fù)雜問題的同時(shí),保持應(yīng)用程序的高效運(yùn)行。這也是其他編程語言難以做到的。

(3)C++是一門復(fù)雜的語言

這個(gè)觀點(diǎn)聽起來有些怪異。C++語言的復(fù)雜性往往是造成人們放棄C++的原因,但同時(shí),C++語言的復(fù)雜性也有可能成為人們選擇C++語言的原因。C++的先去大師Andy Koenig在他的《C++沉思錄》里回?fù)袅藢?duì)C++復(fù)雜的攻擊。他認(rèn)為,選擇什么樣的編程語言,取決于要解決的問題。世上沒有萬靈藥,要解決復(fù)雜的問題,必要要依賴于復(fù)雜的工具。C++程序員是實(shí)用主義者,他們首先保證問題能被解決,其次才能談得上其他。實(shí)際上,要解決的問題是復(fù)雜的,計(jì)算機(jī)系統(tǒng)使不完美的,人類的自然語言體系和表達(dá)習(xí)慣就更是不完美的。而一門成熟的通用編程語言,要在這三極之間保持平衡,談何容易。Java語言通過削減矛盾(用虛擬機(jī)代替真實(shí)機(jī)器),削減表達(dá)能力來獲得簡(jiǎn)單性,這也同時(shí)限制了它在實(shí)時(shí)性高計(jì)算密集的領(lǐng)域里得到應(yīng)用。無論是調(diào)度仿真、實(shí)時(shí)控制還是媒體編輯,一旦觸及重量型的關(guān)鍵應(yīng)用,除了C++你別無選擇。C++的復(fù)雜性源于對(duì)其高效解決問題的承諾。這就好比,現(xiàn)實(shí)生活中,思想簡(jiǎn)單的人不能委以重任。

(4)C++是一門成熟的編程語言。

這并不是說其他的編程語言不成熟。成熟是一種相對(duì)的概念。C++語言在其30多年的發(fā)展和使用過程中,開發(fā)了無數(shù)成功的軟件系統(tǒng),積累了豐富的成功案例和可重用資源。其數(shù)量之大,應(yīng)用之廣,影響之深,也是首屈一指。有興趣的讀者可以光臨Bjarne Stroustrup教授的主頁,了解一下C++語言在業(yè)界創(chuàng)造的輝煌戰(zhàn)績(jī)。

4.如何應(yīng)對(duì)C++的復(fù)雜性

盡管C++的復(fù)雜性有其產(chǎn)生的深刻背景,但復(fù)雜性確實(shí)是個(gè)問題。在實(shí)踐上最突出的表現(xiàn)就是開發(fā)效率的降低,畢竟簡(jiǎn)單易用的工具能帶來生產(chǎn)率的提高。但是C++的復(fù)雜性導(dǎo)致了開發(fā)效率的降低只是一種表象,它是沒有對(duì)復(fù)雜性進(jìn)行有效控制而產(chǎn)生的后果。換句話說,問題不在于C++的復(fù)雜性,而在于使用C++的人有沒有有效控制這種復(fù)雜性。

那么,如何應(yīng)對(duì)C++的復(fù)雜性,下面給出幾點(diǎn)建議。

(1)用沉穩(wěn)的心態(tài)去學(xué)習(xí)C++

學(xué)習(xí)編程語言,掌握語法,能上手實(shí)踐,不過是萬里長(zhǎng)征邁出了第一步。更何況想C++這樣的語言,要做到掌握各個(gè)子語言的基本內(nèi)容,都不是一件容易的事情。所以,心態(tài)一定要平穩(wěn),著急不來,更不可輕狂。要真正掌握語言,非得集中精力學(xué)習(xí)實(shí)踐一兩年,將該語言所擅長(zhǎng)領(lǐng)域的應(yīng)用問題熟悉過一遍,才有可能。若論精通,啊那是一個(gè)沒有止境的過程,Henry Spencer用了30年C,仍樂此不疲。Pragmatic Programmer中評(píng)價(jià)Ruby說,學(xué)上四個(gè)小時(shí)就可以用它解決實(shí)際問題,但是10年之后還為它層出不窮的心意感到驚訝。真正掌握C++語言之后,再熟悉一兩門層次不同,思維不同的語言,那就是更高層次的追求了。

要注意的是,這也是一個(gè)心理學(xué)的問題。C++語言中總是存在著一些新奇的特性,它會(huì)引起你強(qiáng)烈的興趣,將你的注意力從真正有用的事情中分離出來。這些被稱之為“奇技淫巧”的東西即使能短暫給你帶來自豪感,但是不應(yīng)該成為你學(xué)習(xí)C++的主流。要注意,不要為了使用每一種特性而去使用,要根據(jù)實(shí)際問題和項(xiàng)目的需求去應(yīng)用C++的特性。

(2)采用科學(xué)的學(xué)習(xí)方法

全面掌握C++固然重要,但是那不等于說,只有掌握了C++全部你愛能用來它解決問題。你可以把你對(duì)C++的理解限制于一個(gè)相對(duì)簡(jiǎn)單的程度,只要你需要解決問題的復(fù)雜度不超過你所掌握的工具的復(fù)雜度。初學(xué)者要把C++分為邏輯層次上、難度比較獨(dú)立的部分,根據(jù)自己的需要循序漸進(jìn)地的學(xué)習(xí),利用每一部分所學(xué)解決能夠解決的問題。只有這樣,才能學(xué)得扎實(shí)。不要怕碰到問題,從某種角度來說,遇到問題是好事,因?yàn)檫@是彌補(bǔ)自己在某方面的無知的機(jī)會(huì)。自己不懂得東西太多了,只是還未暴露出來。解決了問題,你就學(xué)到了東西。

(3)正確的使用C++

C++被錯(cuò)誤地使用是一種很普遍的現(xiàn)象,這也是C++遭受“過于復(fù)雜”的抱怨的真正原因。C++語言由4個(gè)子語言組成,C++語言提供了如此豐富的特性和自由度。如何選這些特性體現(xiàn)了C++程序員的真正“功力”和成熟度。

首先,要小心選擇你所使用的子語言。例如,C++是向下兼容C的。那么,是不是在任何場(chǎng)合下,都要使用C++的面向?qū)ο蟮奶匦阅??或者無論在什么情況下,都選擇C,因?yàn)镃更簡(jiǎn)單?這是一刀切的思維實(shí)不可取的。顯然C有自己擅長(zhǎng)的領(lǐng)域,比如設(shè)備驅(qū)動(dòng)開發(fā)、操作系統(tǒng)的大部分工作都不需要OOP/GP( Object Oriented Programming/Generic Programming)。然而,在更多領(lǐng)域,抽象與效率是并重的,這些正是C++的面向?qū)ο蟮奶匦赃m用的場(chǎng)合。

其次,充分利用現(xiàn)有的、經(jīng)過實(shí)踐檢驗(yàn)的資源。代碼重用是現(xiàn)代軟件工程提倡的一種做法,不僅因?yàn)樗梢蕴岣唛_發(fā)效率,還因?yàn)樗梢越档统绦虻膹?fù)雜程度。如果一個(gè)高效的容器(或智能指針)能把你從無聊的手動(dòng)內(nèi)存管理中解放出來,為啥還要用那原始的malloc/free呢?如果一個(gè)好的string類或正則表達(dá)式類能把你從繁瑣的字符串處理中解脫出來,那么為啥要手動(dòng)去做這些是呢?如果一個(gè)transform(或for-each)能夠用一行代碼把事情漂亮搞定,為啥還要手寫一個(gè)for循環(huán)呢?

再次,控制你代碼的復(fù)雜程度。C++語言不是為了復(fù)雜而復(fù)雜,而是因?yàn)橐鉀Q復(fù)雜的問題而引入了復(fù)雜的機(jī)制。問題的關(guān)鍵在于,程序有時(shí)是自己把問題搞復(fù)雜了。例如在C++中,一個(gè)普通程序員很可能會(huì)寫出一堆高度耦合的類,很快情況就變得一團(tuán)糟。但這不是C++的問題,這種情況很可能發(fā)生在任何一門面向?qū)ο笳Z言中,因?yàn)榭傆谐绦騿T在還沒有弄懂什么是has-a和is-a之前,就敢于在類上再寫類,就這樣一層一層的堆砌上去。它們學(xué)會(huì)了在一門特性語言中如何定義類,如何繼承類的語法,然后就認(rèn)為自己已經(jīng)掌握了OOP的精髓了。

由于C++是如此靈活,很多問題在C++中都有好幾中解決辦法,于是在這些選擇中進(jìn)行權(quán)衡本身就成了一個(gè)困難這也是得程序員犯錯(cuò)誤的可能性增加了。所以掌握一門優(yōu)秀的設(shè)計(jì)思想(比如說優(yōu)先使用組合而不是繼承),或者遵循C++社群這些年積攢下來的只會(huì),或者說干脆只使用C++語言中C with Class部分以規(guī)避復(fù)雜性的風(fēng)險(xiǎn),都是程序員需要不斷學(xué)習(xí)和不斷實(shí)踐的。
總之,正確使用C++所應(yīng)遵循的原則是:了解C++的高級(jí)特性,用簡(jiǎn)單的方法解決簡(jiǎn)單的問題,用簡(jiǎn)單的形式解決復(fù)雜的問題,即將復(fù)雜的解決方案包裝在簡(jiǎn)單的形式之下,重用前人的勞動(dòng)成果,遵循最佳的實(shí)踐。

以上就是簡(jiǎn)述C++的復(fù)雜性的詳細(xì)內(nèi)容,更多關(guān)于C++的復(fù)雜性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++11中的noexcept關(guān)鍵字

    c++11中的noexcept關(guān)鍵字

    這篇文章主要介紹了c++11中的noexcept關(guān)鍵字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++虛繼承原理與類布局深度分析

    C++虛繼承原理與類布局深度分析

    這篇文章主要介紹了C++虛繼承原理與類布局分析,本文的目標(biāo)是探究虛繼承的實(shí)現(xiàn)方式和類布局(Class Layout)的具體規(guī)則,需要的朋友可以參考下
    2024-04-04
  • c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下
    2014-04-04
  • C語言制作簡(jiǎn)易金山打字通功能的代碼

    C語言制作簡(jiǎn)易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語言制作簡(jiǎn)易金山打字通功能的代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言中斐波那契數(shù)列的三種實(shí)現(xiàn)方式(遞歸、循環(huán)、矩陣)

    C語言中斐波那契數(shù)列的三種實(shí)現(xiàn)方式(遞歸、循環(huán)、矩陣)

    本文主要介紹了C語言中斐波那契數(shù)列的三種實(shí)現(xiàn)方式(遞歸、循環(huán)、矩陣),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c語言中if語句是怎么變成匯編代碼的詳解

    c語言中if語句是怎么變成匯編代碼的詳解

    if語句是指編程語言,包括c語言、C#、VB、java、匯編語言等,下面這篇文章主要給大家介紹了關(guān)于c語言中if語句是怎么變成匯編代碼的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C++ 私有析構(gòu)函數(shù)的作用示例詳解

    C++ 私有析構(gòu)函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構(gòu)函數(shù)的作用,私有析構(gòu)函數(shù)不會(huì)影響棧上對(duì)象的自動(dòng)析構(gòu),它們會(huì)在其作用域結(jié)束時(shí)自動(dòng)調(diào)用析構(gòu)函數(shù)。私有析構(gòu)函數(shù)主要影響的是對(duì)堆上對(duì)象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系

    C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系

    這篇文章主要介紹了C++中Cbitmap,HBitmap,Bitmap區(qū)別及聯(lián)系的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器和qsort

    C++回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器和qsort

    這篇文章主要介紹了C++回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器和qsort,回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)
    2022-08-08
  • 使用C語言中的time函數(shù)獲取系統(tǒng)時(shí)間

    使用C語言中的time函數(shù)獲取系統(tǒng)時(shí)間

    在C語言中可以使用time函數(shù)來獲取系統(tǒng)時(shí)間,以下對(duì)time函數(shù)進(jìn)行了介紹,需要的朋友可以過來參考下
    2013-07-07

最新評(píng)論