(Translated by https://www.hiragana.jp/)
C++ - 维基百科,自由的百科全书

C++

通用つうようだかかいほどしきげん

C++一种被广泛使用的计算机程序设计语言。它是いち通用つうようほどしき設計せっけいげん支援しえん多重たじゅう编程范式れい過程かていほどじょ設計せっけいめんこう对象ほどじょ設計せっけい泛型ほどしき設計せっけい函数かんすうしきほどじょ設計せっけいひとし

C++
编程范型范型めんこう对象编程過程かていへんほど泛型编程
設計せっけいしゃまさ·斯特劳斯とく鲁普
发行时间1983ねん,​41ねんまえ​(1983
とうぜん版本はんぽん
  • C++20 (2020ねん12月;穩定版本はんぽん)[1]
編輯維基數據鏈接
かたたい系統けいとうせい态类がたつよ类型安全あんぜん
じつさくげんC++、C とう
ぶんけん扩展めい.C .cc .cpp .cxx .c++(みなもとぶんけん
.h .hh .hpp .hxx .h++(头文けん
あみisocpp.org
主要しゅようさく產品さんぴん
Embarcadero C++Builder, GCC, Intel C++ Compiler, Microsoft Visual C++, LLVM Clang
衍生ふくかたりげん
ISO/IEC 14882:1998, ISO/IEC 14882:2003, ISO/IEC 14882:2011, ISO/IEC 14882:2014, ISO/IEC 14882:2017
啟發けいはつげん
Ada 83, ALGOL 68, C, CLU, ML, Simula
影響えいきょうげん
Ada 95, Aikido, C99, C#, Clojure, D, Dao, Falcon, Java, Lua, Perl, PHP

まさ·斯特ろう斯特魯普博士はかせざい贝尔实验しつ工作こうさく间在20世紀せいき80年代ねんだい發明はつめいなみ實現じつげんりょうC++。おこりはつ,這種げんしょうさくC with Classes”(“包含ほうがんるいてきCげん”),作為さくいCげんてき增強ぞうきょうばん出現しゅつげんずいきさき,C++不斷ふだん增加ぞうかしん特性とくせいきょ函数かんすう运算じゅう繼承けいしょう标准ばん异常处理运行时类がたしんいき命名めいめい空間くうかんとう概念がいねん逐漸納入のうにゅう標準ひょうじゅん草案そうあん。1998ねん國際こくさい標準ひょうじゅん組織そしき頒布はんぷりょうC++ほどじょ設計せっけいげんてきだいいち國際こくさい標準ひょうじゅんISO/IEC 14882:1998,目前もくぜん最新さいしん标准为ISO/IEC 14882:2020。ISO/IEC 14882通称つうしょうISO C++。ISO C++包含ほうがんりょう主要しゅよう包含ほうがんりょう核心かくしん语言标准库的规则。つきかん从核こころ语言いた标准库都ゆう显著不同ふどう,ISO C++直接ちょくせつ正式せいしき(normative)引用いんようりょうISO/IEC 9899(通称つうしょうISO C),且ISO C++标准库的いち部分ぶぶんISO Cてき标准库的API完全かんぜんしょうどう,另有很小いち部分ぶぶんC标准库略ゆう异(れい如,strcatとう函数かんすう提供ていきょうconst类型てきじゅう载)。这使とくCC++てき标准库实现常つねいち提供ていきょうざい核心かくしん语言规则很大一部分兼容的情况下,进一步确保用户通常较容易把符合ISO Cてきみなもとほどじょ经修あらためある经极しょうおさむあらため直接ちょくせつさく为C++みなもとほどじょ使用しよう,也是C++语言继C语言きさき流行りゅうこうてきいち个重よう原因げんいん

さく为广泛被使用しようてきこう业语ごと,C++存在そんざい流行りゅうこうてき成熟せいじゅく实现:GCCもとLLVMてきClang以及Visual C++ひとし。这些实现どう时也成熟せいじゅくてきC语言实现,ただし对C语言てき支持しじ程度ていど不一ふいつれい如,VC++对ANSI C89これきさきてき标准支持しじ较不かんぜん)。だい多数たすう流行りゅうこうてき实现包含ほうがんりょう编译C++部分ぶぶん标准库的实现。编译直接ちょくせつ提供ていきょう核心かくしん语言规则てき实现,而库提供ていきょうISO C++标准库的实现。这些实现ちゅう,库可能かのうどう包含ほうがんISO C标准库的共用きょうよう实现(如VC++てきmsvcrt);而另いち些实现的ISO C标准库则单独于编译器项目そと提供ていきょうてき,如glibcmusl。C++标准库的实现也可能かのう支持しじ种编译器,如GCCてきlibstdc++库支持しじGCCてきg++かずLLVM Clangてきclang++。这些不同ふどうてき丰富组合使めんじょうてきC++环境具有ぐゆう许多细节じょうてき实现异,いん而遵循ISO C++这样てき权威标准对维移植いしょくせい显得さら重要じゅうよう。现今讨论てきC++语言,じょ另行ゆびあきら通常つうじょうひとしゆびISO C++规则てい义的C++语言(虽然いん为实现的异,可能かのう一定いってい最新さいしんてき正式せいしき版本はんぽん)。

值得注意ちゅうい流行りゅうこうてき误解不同ふどう,ISO CISO C++未明みめい要求ようきゅうげんほどじょ编译(compile),而仅要求ようきゅうこぼし译(translate)いん此CC++并不しょ谓的编译がた语言[らいみなもと請求せいきゅう]わざ术上,实现CC++ほどじょてき单位こぼし译单もと(translation unit)。さく为对Java语言规范ちゅう就明确要求ようきゅうJavaほどじょ编译实现,あきら存在そんざい编译单元(compilation unit)。实际じょうCC++也存在そんざいREPL形式けいしきてきかい释器实现,如CINTClingただしよし为传统上CC++以编译器实现,习惯じょう仍有いち混用こんよう,甚至いたりこん仍出现在ISO C++ぼう节标じゅん库条款的标题页面そん档备份そん互联网档あんじょう

传统じょう,C++语言视为C语言实现性能せいのう相近すけちかてき语言,つよ调运ぎょう时的だかこう根據こんきょ《C++へんほど思想しそう》(Thinking in C++いちしょ,C++あずかCてきだい码执ぎょう效率こうりつ往往おうおう相差おうさつざい±5%これあいだ[2]

发展历史

编辑
 
まさ·とくろう斯特魯普,C++これちち

C++かたりげん發展はってん大概たいがい以分ためさん階段かいだんだいいち階段かいだんしたがえ80年代ねんだいいた1995ねん。這一階段かいだんC++かたりげん基本きほんじょう傳統でんとう類型るいけいじょうてきめんこう对象かたりごとなみ且憑藉着接近せっきんCげんてき效率こうりつざい工業こうぎょうかい使用しようてき開發かいはつげんちゅう佔據りょう相當そうとうだい份額;だい階段かいだんしたがえ1995ねんいた2000ねん,這一階段かいだんよし標準ひょうじゅんいた後來こうらいてきBoostとうほどしきてき出現しゅつげん泛型ほどじょ設計せっけいざいC++ちゅう佔據りょう越來ごえくえつてき比重ひじゅう當然とうぜん同時どうじよしJavaC#とうかたりげんてき出現しゅつげんかたからだ價格かかくてきだい規模きぼ下降かこう,C++受到りょう一定いっていてき衝擊しょうげきだいさん階段かいだんしたがえ2000ねんいたりいまゆかり於以LokiMPL(Boost)とうほどしきため代表だいひょうてきさんせいしきへんほどかたぎ板元はんもとへんほどてき出現しゅつげん,C++出現しゅつげんりょう發展はってん歷史れきしじょうまたいちしんてき高峰こうほう,這些しん技術ぎじゅつてき出現しゅつげん以及はらゆう技術ぎじゅつてき融合ゆうごう使つかいC++やめけいなりため當今とうぎん主流しゅりゅうほどじょ設計せっけいげんちゅうさい複雜ふくざつてき一員いちいん

まさ·とくろう斯特魯普工作こうさくおこり於1979ねんてきC with Classes。這個構思起源きげん於斯とく劳斯とく鲁普做博士はかせ論文ろんぶんてき一些程式撰寫經驗。發現はつげんSimula具備ぐび很利於大おだいがた軟體開發かいはつてきとくてんただしSimulaてき執行しっこう速度そくどふとし慢,無法むほうたい現實げんじつ需求發揮はっきこうこうBCPL雖快とくただし它過於低かいてき特性とくせい使つかい其不てき於大おだいがた軟體てき開發かいはつとう斯特劳斯とく鲁普開始かいしざいかいなんじ實驗じっけんしつ工作こうさくゆう分析ぶんせきUNIX核心かくしんせき分散ぶんさんしき計算けいさんてき問題もんだいかい想起そうきてき博士はかせ論文ろんぶん經驗けいけん,斯特劳斯とく鲁普開始かいしためCげん增強ぞうきょういち類似るいじSimulaてきとくてん[3]これ所以ゆえん選擇せんたくC,いんため它適於各種かくしゅ用途ようと快速かいそく移植いしょくせいじょりょうC语言Simulaこれがい同時どうじ也從其它げんちゅう取得しゅとく靈感れいかん,如ALGOL 68AdaCLU以及ML

つよし開始かいし類別るいべつ衍生類別るいべつもうかそん類型るいけいけん查、內聯かけしょうさんすう特性とくせいみやこただし透過とうかCfront引入Cげんなか[4]

1983ねんC with Classesあらため命名めいめいためC++(++C语言ちゅうてきぞう操作そうさ)。加入かにゅうりょうしんてき特性とくせい,其中包括ほうかつきょなずらえはこしきはこしき名和なわ運算うんざん參考さんこう常數じょうすう使用しようしゃひかえせいてき自由じゆう空間くうかんもうかそんひかえせい改良かいりょうてきがたべつけん查,并恢复了BCPL风格てきそう斜線しゃせん//單行たんこうちゅう释(これきさきC99支持しじりょう这种ちゅう释)。

1985ねんはつ佈第いちはん《C++ほどしき設計せっけいげん》,提供ていきょういち重點的じゅうてんてきげん參考さんこういたり此還かんかた標準ひょうじゅん[5]。1985ねん10がつ出現しゅつげんりょうだいいち商業しょうぎょうはつ佈。

1989ねんはつ佈了Release 2.0。引入りょう多重たじゅう繼承けいしょう抽象ちゅうしょう類別るいべつ靜態せいたい成員せいいんはこしき常數じょうすう成員せいいんはこしき,以及成員せいいん保護ほご。1990ねん出版しゅっぱんりょうThe Annotated C++ Reference Manual。這本しょ後來こうらいなりため標準ひょうじゅんてき基礎きそややかえ引入りょうばん例外れいがい處理しょり命名めいめい空間くうかんしんてき強制きょうせい类型转换,以及ぬのりん类型。

ずいちょC++かたりげんてきえんじへん,也逐ややえんじ相應そうおうてき標準ひょうじゅんほどしきさいさきすすむC++標準ひょうじゅんはこしきてきくしりゅうI/Oほどしき,其用以取だい傳統でんとうてきCはこしき,如printfscanfずいしょ引入てきほどしきちゅうさい重要じゅうようてき便びん標準ひょうじゅんいた,簡稱STL

多年たねんいち聯合れんごうてきANSI-ISO委員いいんかい於1998ねんたいC++標準ひょうじゅんISO/IEC 14882:1998)。在官ざいかんかたしゃくいずる1998標準ひょうじゅんてき若干じゃっかんねん委員いいんかい處理しょり缺陷けっかん報告ほうこくなみ於2003ねんはついちC++標準ひょうじゅんてき修正しゅうせい版本はんぽん。2005ねんいち份名ためLibrary Technical Report 1(簡稱TR1てき技術ぎじゅつ報告ほうこくしゃくいずる。雖然かえかんかた標準ひょうじゅんてきいち部分ぶぶん它所提供ていきょうてきいく擴展もちなりためいちはんC++標準ひょうじゅんてきいち部分ぶぶんいく所有しょゆう目前もくぜん仍在維護てきC++へんやくみなやめ支援しえんTR1

目前もくぜん最新さいしんてきC++标准2020ねん12月发布てきISO/IEC 14882:2020[6]またたたえC++20

雖然C++本身ほんみせんただし標準ひょうじゅんぶんけん本身ほんみなみめんてきつきかん标准ぶん档不めん费的,ただし容易ようい从网络中取得しゅとくさい简单てき就是C++标准ぶん档之まえてきさいきさきいち草稿そうこう版本はんぽん,它与标准てき别几乎只ざい于排ばんじょう

C++名字みょうじてき由來ゆらい

编辑

C++這個名字みょうじRick Mascitti於1983ねんちゅうしょ建議けんぎてきなみ於1983ねん12月くび使用しようさらはや以前いぜんなおざい研究けんきゅう階段かいだんてき發展はってんちゅうげん曾被しょうためnew C」,これC with Classes」。ざい電腦でんのう科學かがくなか,C++仍被しょうためCげんてき上層じょうそう結構けっこう。它最とくめい於Cげんちゅうてき「++」運算うんざん(其對變數へんすうてき進行しんこう遞增ていぞう)。而且ざい共同きょうどうてき命名めいめい約定やくじょうちゅう使用しよう「+」以表示ひょうじ增強ぞうきょうてきほどしき。斯特劳斯とく鲁普せつ:「這個名字みょうじ象徵しょうちょうちょげん於Cげん變化へんかてき自然しぜんえんじすすむ」。C+いちC/C++無關むせきてき早期そうきほどしきげん

Rick Mascittiざい1992ねん正式せいしきといおこり名字みょうじてき由來ゆらい表示ひょうじ這是ざい半開はんかい玩笑ちゅうせつてきしたがえぼつおもえC++かいなりため這門げんてき正式せいしき名字みょうじ

ゆういちせき於C++名字みょうじてき笑話しょうわとう你使用後ようごつづり++とき附加ふかただ發生はっせいざい運算うんざんこれいん此,它應該是++C,而不C++,这个わらい话是说时ぼう些程じょ员还ざい使用しようCてき方式ほうしき使用しようC++,这通常つうじょう一些权威著作认为是不正确的)。

C++标准

编辑

ゆかりISO/IEC JTC1/SC22/WG21进行。やめ出版しゅっぱんてき标准ぶん档如

发布时间 ぶん 通称つうしょう 备注
2023 N4950(草稿そうこう,发布于2023-05-10)[7] C++23
2020 ISO/IEC 14882:2020[6] C++20
2018 ISO/IEC TS 21544:2018[8] modules TS かたぎ
2018 ISO/IEC TS 19570:2018[9] parallelism TS 并行扩展
2018 ISO/IEC TS 19216:2018[10] networking TS 网络库
2017 ISO/IEC 14882:2017[11] C++17 だい个C++标准
2017 ISO/IEC TS 22277:2017[12] coroutines TS 协程库扩てん
2017 ISO/IEC TS 21425:2017[13] ranges TS 提供ていきょう范围つくえせい
2017 ISO/IEC TS 19568:2017[14] library fundamentals TS 标准库扩てん
2016 ISO/IEC TS 19571:2016[15] concurrency TS よう于并发计さんてき扩展
2015 ISO/IEC TS 19217:2015[16] concepts TS 概念がいねん库,よう于优编译しんいき
2015 ISO/IEC TS 19841:2015[17] TM TS こと务性ないそん操作そうさ
2015 ISO/IEC TS 19570:2015[18] parallelism TS よう于并ぎょう计算てき扩展
2015 ISO/IEC TS 18822:2015[19] filesystem TS ぶんけんけい
2014 ISO/IEC 14882:2014[20] C++14 だいよん个C++标准
2011 ISO/IEC TR 24733:2011[21] - 十进制浮点数扩展
2011 ISO/IEC 14882:2011[22] C++11 だいさん个C++标准
2010 ISO/IEC TR 29124:2010[23] - 数学すうがく函数かんすう扩展
2007 ISO/IEC TR 19768:2007[24] C++TR1 C++わざ术报つげ:库扩てん
2006 ISO/IEC TR 18015:2006[25] - C++性能せいのうわざ术报つげ
2003 ISO/IEC 14882:2003[26] C++03 だい个C++标准
1998 ISO/IEC 14882:1998[27] C++98 だいいち个C++标准

設計せっけい原則げんそく

编辑

ざい《C++かたりげんてき設計せっけいえんじ》(1994)ちゅうBjarne Stroustrup描述りょうざい設計せっけいC++ときしょ使用しようてきいち原則げんそく知道ともみち這些原則げんそくゆうじょ理解りかいC++ためなんかい現在げんざい這個樣子ようす以下いかそうゆいりょういち原則げんそくしょうつきてき內容さん閱《C++かたりげんてき設計せっけいえんじ》:

  • C++設計せっけいなり直接的ちょくせつてき和廣かずひろ泛的支援しえん多種たしゅほどしき設計せっけい風格ふうかく過程かていほどしき設計せっけいかずすえ抽象ちゅうしょう物件ぶっけんみちびけこうほどしき設計せっけい泛型ほどしき設計せっけい)。
  • C++設計せっけいなりきゅうほどしき設計せっけいしゃさらてき選擇せんたくそく使つかい可能かのうしるべ致程しき設計せっけいしゃ選擇せんたく錯誤さくご
  • C++設計せっけいなり可能かのうあずかCあいよう,藉此提供ていきょういちしたがえCいたC++てき平滑へいかつ過渡かと
  • C++避免平台ひらだい限定げんていあるぼつゆう普遍ふへん用途ようとてき特性とくせい
  • C++使用しようかいたいらいがくがいひらき銷的特性とくせい
  • C++設計せっけいなり複雜ふくざつてきほどしき設計せっけい環境かんきょう

標準ひょうじゅんほどじょ

编辑

1998てきC++標準ひょうじゅんぶんため兩個りゃんこ部分ぶぶん核心かくしんげんC++標準ひょうじゅんほどしき後者こうしゃ包含ほうがんりょうだい部分ぶぶん標準ひょうじゅんいたC標準ひょうじゅんほどしきてきややおさむ改版かいはんほん存在そんざい許多きょたぞく於標じゅん部分ぶぶんてきC++ほどしき,且使用しよう外部がいぶ連結れんけつほどしき甚至以用Cせんうつし

C++標準ひょうじゅんほどしき充分じゅうぶん吸收きゅうしゅうりょうC標準ひょうじゅんほどしきなみ以少もとてきおさむあらため使つかい其與C++良好りょうこうてきうんさく。另一個大型的程式庫部分,標準ひょうじゅんいたSTLため基礎きそSTL於1994ねん2がつ正式せいしきなりためANSI/ISO C++。它提供ていきょうりょう實用じつようてき工具こうぐ,如容器ようき(如:ArrayVector),迭代廣義こうぎゆび提供ていきょう容器ようき類似るいじ陣列じんれつてきそん方式ほうしき,以及泛型算法さんぽう進行しんこうさがせひろはいじょてき運算うんざん。此外かえ提供ていきょうりょう(multi)map(multi)set,它們どもとおる相似そうじてきなり员函すうよし此,以下いかなりため可能かのう使用しようばんせんうつし泛型算法さんぽう,它可以和にんなん容器ようきある在任ざいにんなん以迭だい定義ていぎてき序列じょれつじょううんさく。如同C,使用しよう#include指令しれい包含ほうがん標準ひょうじゅんひょうあたまそくそんほどしきうらてきこうのう。C++提供ていきょう69標準ひょうじゅんひょうあたま,其中19さい贊成さんせい使用しよう

使用しよう標準ひょうじゅんいたれい如:使用しようstd::vectorあるstd::stringだいC風格ふうかくてきすう组或すう组)ゆうじょ於开发更安全あんぜんさられいかつてき软件。

ざいSTLざい納入のうにゅうC++標準ひょうじゅん以前いぜんHP後來こうらいてきSGIてきだいさん方程式ほうていしき標準ひょうじゅんちゅうなみしょうためSTL」,它只標準ひょうじゅんちゅうてきいち部分ぶぶんただし仍有許多きょたじん使用しよう這個名稱めいしょう,以別於其它的標準ひょうじゅん輸入ゆにゅう輸出ゆしゅつくしりゅう國際こくさい診斷しんだん、Cほどしきしゅうとうとう)。 另外,如std::basic_string此类标准员会添加てんかてきせっこうゆう时也误认为STL;实际じょう它们并不存在そんざい原始げんしてきSGI STLなかざい标准きさきSGI STLざい从标じゅん吸收きゅうしゅう加入かにゅう其中。

C++ちゅうてき特色とくしょく

编辑

Cげんしょう,C++引入りょうさらてき特性とくせい包括ほうかつ:复合类型(引用いんよう類型るいけいとう)、const限定げんていconstexprつねりょうひょう达式、类型处理运算(类型别名及autodecltypeひとし种类がた指示しじ)、C++标准库(IO库与种容类)あずか迭代、动态ないそんあずか智能ちのうゆび针、はこすうじゅうめんこう对象ほどじょ设计(如数すえ抽象ちゅうしょう成員せいいん函数かんすう、类作よういき、构造函数かんすうあずか析构函数かんすうせい态成员、访问ひかえせいあずか繼承けいしょうきょ函数かんすう抽象ちゅうしょう类与せっこうとう)、拷贝ひかえせい、运算じゅう载、造型ぞうけいあずか函数かんすう风格てき強制きょうせい类型转换、ばんあずか泛型编程,以及異常いじょう處理しょり命名めいめい空間くうかん继承あずかむなし继承、运行时类がた识别及嵌套类とう

C++ざいぼう些案れいちゅうあずかCあいようしょ」),進行しんこうCかえようてき類型るいけいけん查。

以「//おこりはじめ作為さくい註解ちゅうかい起源きげんCてき前身ぜんしんBCPL,而後じゅうしん引入いたC++。

C++てきいち些特せい,C久之ひさゆき採用さいようりょう包括ほうかつざいfor循环てきくくごうちゅう声明せいめい,C++風格ふうかくてき註解ちゅうかい使用しよう//符號ふごうinline,雖然C99定義ていぎてきinlineせきかぎあずかC++てき定義ていぎあいようC99也引にゅうりょう存在そんざい於C++てき特性とくせい,如:变参すうきょしゅうかず陣列じんれつ作為さくいさんすうてき較佳處理しょりぼう些C++へんやく能實のうじつさく若干じゃっかん特性とくせい,以作為さくい擴展,ただし其餘部分ぶぶんなみ符合ふごう現存げんそんてきC++特性とくせい

一個常見的混淆其實只是一個微妙的術語問題:よし於它てきえんじC,ざいC++ちゅうてき術語じゅつご对象Cげんいちよう意味いみちょ記憶きおくたい區域くいき,而不類別るいべつてき實體じったいざい其它絕大ぜつだい多數たすうてき物件ぶっけんしるべむこうかたりげん也是如此。舉例らいせつざいCC++ちゅう語句ごくint i;定義ていぎいちintかたべつてき物件ぶっけん,這就變數へんすうてきiはたざいゆび所存しょぞんいれてき記憶きおくたい區域くいき

C++语言ちゅうてきconst关键

编辑

constいち个CC++语言てき关键意思いし声明せいめい一個不能改變值的变量,そくただ读。使用しようconstざい一定程度上可以提高程序的安全性和可靠性,也便于实现对此进ぎょう优化(如把ただ读对ぞういれROMなか)。constさく为型べつ限定げんていがたべつてきいち部分ぶぶん

C++だいいち正式せいしき引入const类型てき语言。80年代ねんだい早期そうきBjarne StroustrupDennis Retchie讨论きさき提供ていきょうりょうざいC语言ちゅうreadonly/writeonlyてき实现つくえせい,并在带類てきCちゅう取得しゅとくりょう一定いってい经验。关键const正式せいしき引入CげんざいANSI C89。这早于第いち个C++くに际标なぞらえきんじゅうねんただし此时constやめC++实现普遍ふへん採用さいよう

以下いかC语言しょうようてき用法ようほう

int m = 1, n = 2; // int 类型てき对象
const int a = 3; // const int 类型てき对象
int const b = 4; //同上どうじょう
const int *p //指向しこう const int 类型对象てきゆび
int const *q; //同上どうじょう
int *const x; //指向しこう int 类型对象てき const ゆび针;注意ちゅうい const てき位置いち
const int *const r; //指向しこう const int 类型对象てき const ゆび
int const *const t; //同上どうじょう

ただしconstざいC++中有ちゅううさら强大きょうだいてき特性とくせい。它允许在编译时确じょうさく真正しんせいてきつねりょうひょう达式。れい如,

const int max_len = 42;
int a[max_len];

此前C语言并不支持しじ这样てき用法ようほうちょくいたC99まこと许用变量さく为数组长需要じゅよう注意ちゅういてきC99なかてきVLA支持しじ运行确定すう组长ただしC++从未支持しじ)。此外,C++ちゅう命名めいめいそら间作よういきてきconst对象てき名称めいしょう隐含内部ないぶ链接。这意味いみ直接ちょくせつざい头文けんさとていconst对象个源ぶんけん包含ほうがん时,也不かい重定しげさだ义。

ざいC++11及之きさきてきC++标准ちゅう,推荐使用しよう拥有さら严格语义てきconstexpr限定げんていらい表示ひょうじ一个可以出现在常量表达式中的变量。const区分くぶん为顶层const(top-level const)かずそこ层const(low-level const)。

实际じょうざい语义ひょう达方めんconstさら表示ひょうじ为“ただ读”,constexprざい表示ひょうじ一定能在翻译时确定的常量,ただし实际もとめ值仍可能かのうざい运行时进ぎょうただゆうぞうさく声明せいめいすう组大しょう这样确定要求ようきゅうつねりょうひょう达式てき上下じょうげ文中ぶんちゅうさいかいいん为需よう确保こぼし译时必须确定しょ需的值而进行こぼし译时もとめ值)。C++20引入りょうさら严格てきconstevalconstinitてき语法,直接ちょくせつ限定げんてい特定とくていてきもとめ值必须在こぼし译时完成かんせい过,const不同ふどうきさき三者修饰声明但不是类型限定げんてい参与さんよ类型声明せいめい构成复合类型,不通ふつう类型检查实现しょ谓的constせい确性(const correctness),也不かげ利用りよう这些特性とくせいてきしょうAPIてき类型签名

いち参照さんしょうCC++设计てき语言ちゅう,也存在そんざい类似てき异。れい如,C#どう具有ぐゆうreadonlyconst关键前者ぜんしゃ接近せっきん原始げんしてきただ读”(そくさいさき讨论てきreadonlyつくえせいC语言ちゅうてきconst),而后しゃさら接近せっきんC++てきconst

あずかCけんよう

编辑

C++ゆう时被认为Cてきちょうしゅうsuperset),ただし这並严谨。

かく版本はんぽんてきISO/IEC 14882てき录Cちゅう指出さしでりょうC++ISO Cてき一些不兼容之处。

だい部分ぶぶんてきCだい码可以很轻易てきざいC++中正ちゅうせい确编译,ただし仍有少数しょうすう异,导致ぼう有效ゆうこうてきCだい码在C++ちゅう失效しっこうあるものざいC++中有ちゅうう不同ふどうてきぎょう为。

さいつね见的异之いち,Cまこと许从void*隐式转换到其它てきゆび标类がたただしC++まこと许。したれつ有效ゆうこうてきCだい码:

// 从void *隐式转换为int *
int *i = malloc(sizeof(int) * 5);

ただしよう使つかい其在CC++两者みなのう运作,就需よう使用しよう显式转换:

int *i = (int *)malloc(sizeof(int) * 5);

另一个常见的移植いしょく問題もんだい,C++てい义了很多てきしん关键,如newclass,它们ざいCほどしきちゅう以作为识べつれい:变量めいてき

C99じょりょう一些不兼容之处,也新ぞうりょういち些C++てき特性とくせい,如//ちゅう释,以及ざいだい码中混合こんごう使用しよう过C99也纳にゅう几个C++冲突てきしん特性とくせい(如:变长すう组、原生げんせい复数类型复合逐字ちくじ常数じょうすう),而C++11やめ加入かにゅうりょうけんようC99预处てき特性とくせい

よし于C++函数かんすうC函数かんすう通常つうじょう具有ぐゆう不同ふどうてき名字みょうじおさむ调用约定所有しょゆうざいC++ちゅうよびさけべてきC函数かんすう,须放ざいextern "C" { /* C函数かんすう声明せいめい */ }これ內。

C++てきHello Worldほどじょ

编辑

下面かめん这个ほどじょ显示“Hello, world!”しかきさき结束运行:

#include <iostream>
// import <iostream>; // C++20 おこり
// import std;        // C++23 おこり

int main() {
    std::cout << "Hello, world!" << std::endl;
    // std::println("Hello, world!"); // C++23 おこり
    return 0;
}

这里也可以使用しようusing指令しれい以避めんつぎ声明せいめいstd::——

#include <iostream>

using namespace std;

int main() {
    cout << "Hello, world!" << endl;
    return 0;
}

如果使用しよう“\n”代替だいたい以上いじょうだい碼裡てきendl”,输出结果相等そうとう

std::cout << "Hello, world!\n";

std::endl 仅仅かいざいぼう个输出流いずるちゅう插入そうにゅう换行,还将执行输出りゅうてき flush() 函数かんすうそく刷新さっしん缓冲),而'\n'则不かい


すえISO C++てき规定,全局ぜんきょくmain函数かんすう必须かえしかいint以下いか两种形式けいしき合法ごうほうてき

int main() {
    // ...
}
int main(int argc, char *argv[]) {
    // ...
}

过,ざいいち些编译器(れいVisual C++じょう

void main() {
    // ...
}

也是合法ごうほうてきただし这样てきうつしほうけんようせい较差。

かたりげん特性とくせい

编辑

运算

编辑

ぶんため

優先ゆうせんけん 運算うんざん 說明せつめい 結合けつごうせい
1 () くくごう よしひだりいたりみぎ
2 !、-、++、-- 邏輯運算うんざんNOT、算術さんじゅつ運算うんざん負號ふごう遞增ていぞう遞減ていげん よしみぎいたりひだり
3 *、/、% 算術さんじゅつ運算うんざんてき乘法じょうほう除法じょほうすう よしひだりいたりみぎ
4 +、- 算術さんじゅつ運算うんざん加法かほう減法げんぽう よしひだりいたりみぎ
5 <<、>>、>>> くらいもと運算うんざんひだりうつりみぎうつり符號ふごうみぎうつり よしひだりいたりみぎ
6 >、>=、<、<= 關係かんけい運算うんざんだい於、だい於等於、しょう於、しょう於等於 よしひだりいたりみぎ
7 ==、!= 關係かんけい運算うんざんとう於、不等ふとう よしひだりいたりみぎ
8 & くらいもと運算うんざんAND よしひだりいたりみぎ
9 ^ くらいもと運算うんざんXOR よしひだりいたりみぎ
10 | くらいもと運算うんざんOR よしひだりいたりみぎ
11 && 邏輯運算うんざんAND よしひだりいたりみぎ
12 || 邏輯運算うんざんOR よしひだりいたりみぎ
13 ?: 條件じょうけんひかえせい運算うんざん よしみぎいたりひだり
14 =、op= 指定してい運算うんざん よしみぎいたりひだり

あずか處理しょり

编辑

C++主要しゅようゆうさんへんやく階段かいだんあずか處理しょりてんやくなり目的もくてき碼和連結れんけつ最後さいごてき兩個りゃんこ階段かいだん一般才視為真正的「へんやく」)。ざいだいいち階段かいだんあずか處理しょりかいしょうあずか處理しょり指令しれいかえかわ成原なりはらはじめ碼,しか後送こうそういたしもいちへんやく階段かいだん

あずか處理しょり指令しれいきょしゅう

编辑

あずか處理しょり指令しれいてきうんさく方式ほうしき根據こんきょ使用しようしゃ定義ていぎてき規則きそく簡單かんたんてき記號きごうもと序列じょれつ置換ちかんなり其它てき記號きごうもと序列じょれつ。它們進行しんこうきょしゅう置換ちかん、含入其它てき檔案(ゆかりそこそう至高しこうかいてき特性とくせいれい包含ほうがんぐみつつみ單元たんげんもとけん)、條件じょうけんしきへんやく條件じょうけんしき含入。れい如:

#define PI 3.1415926535897932384626433832795028841971693993751

原始げんしだい码中出現しゅつげんてきPIみやこすすむかいかえかわため3.1415926535897932384626433832795028841971693993751。另いち普遍ふへんてきれい

#include <iostream>

它將使用しよう標準ひょうじゅん头文けんiostreamなかてき所有しょゆう内容ないようらいかえかわ本條ほんじょうあずか處理しょり指令しれいじょりょう以上いじょうひっさげいたてき常用じょうよう指令しれい以外いがいかえゆういくがく外的がいてきあずか處理しょり指令しれい以用らいひかえせいへんやくりゅうほど條件じょうけんしき含入ある排除はいじょだい碼區かたまりとうとう

まいりあずか處理しょりCあずか處理しょり

ばん

编辑

ばんTemplateゆびC++ほどしきげんちゅうてきはこしきばんfunction templateあずか類別るいべつばんclass template),這種觀念かんねん取材しゅざいSimulaてき泛型ほどしき設計せっけい。它采ようtypenameclass两个关键らい标识ばん類別るいべつてきがたべつさんすうC++11C++14ぶん别引にゅうりょう类型别名ばん变量ばん

類別るいべつあずか对象

编辑

ざい物件ぶっけんみちびけこう物件ぶっけんほどしき設計せっけい術語じゅつごちゅう物件ぶっけんobject資料しりょうdataかず處理しょり資料しりょうてき指令しれいinstructionsてき聯合れんごうassociation)。模擬もぎsimulate實際じっさい世界せかいreal-world),物件ぶっけんゆうさんしゅ特質とくしつcharacteristics):狀態じょうたいState)、行為こういBehavior)、同一どういつせい身分みぶんえいIdentity (object-oriented programming)なみ使用しよう訊息(messageらい引發彼此ひしてき互動。類別るいべつclassため物件ぶっけんてきあいある工廠こうしょう定義ていぎりょう物件ぶっけんてき抽象ちゅうしょう特質とくしつ包括ほうかつ物件ぶっけんてき屬性ぞくせい特質とくしつ物件ぶっけんてき行為こうい特質とくしつ屬性ぞくせいてき值即物件ぶっけんてき狀態じょうたい行為こういそく物件ぶっけんのう夠做てきこと

C++ため類別るいべつ構成こうせいしき物件ぶっけんみちびけこうほどしき設計せっけいげんclass-based object-oriented programming language),類別るいべつ概念がいねん具現ぐげんreification作為さくいとう公民こうみんsecond-class citizenだし現在げんざいC++かたりげんとうちゅうざい語法ごほうちゅう明確めいかく使用しよう類別るいべつらい做到資料しりょう抽象ちゅうしょうふうそうぐみ繼承けいしょうがたべつがた物件ぶっけん狀態じょうたいてき自動じどうはつはじめ。C++ちゅういち類別るいべつそくためいちがたべつじょうふうそういち類別るいべつそくためいち抽象ちゅうしょう資料しりょうがたべつAbstract Data TypeADT),繼承けいしょうがたかたぎいたきょうりょう類別るいべつてき抽象ちゅうしょうせいざいC++使用しようclassあるstruct兩個りゃんこせきかぎ宣告せんこく類別るいべつclass),而使用しようnew運算うんざん實體じったい類別るいべつさんせいてき實體じったいinstanceそくため物件ぶっけん一等いっとう公民こうみん。C/C++以資料しりょう成員せいいんdata memberひょうたち屬性ぞくせい,以成いんはこしきmember functionひょうたち行為こうい

声明せいめいいちCar class

class Car {
private:
    int isRunning;
public:
    Run();
};

ただし仍然需要じゅよう注意ちゅうい,严格らい说,C++ちゅう对象てき概念がいねんCてき对应概念がいねん接近せっきん表示ひょうじてき具有ぐゆう特定とくてい类型てきそん储,而非めんこう对象义上てき“对象”:一个对象不一定是类类型的。此外,C++义上てき“实例”仅指ばん实例てき结果,而并ゆび对象。さく为对Javaてき“对象”かず“实例”てき概念がいねん这里てき使用しよう一致いっち

ふうそう

编辑

ふうそうEncapsulationこれはた資料しりょう處理しょり資料しりょうてきほどじょprocedure組合くみあいおこりらい,僅對外たいがい公開こうかいせっこうinterface),达到しんいき隐藏(information hidingてきこうのうふうそうてきゆうてん是能これよし減少げんしょう耦合(Coupling)。C++、Java、C# とうげん定義ていぎ对象ざい語法ごほうちゅう明確めいかく使用しよう類別るいべつClassらい做到ふうそう

C++てき類別るいべつ对其なり员(包括ほうかつすうすえなり员、函数かんすうなり员)ぶん为三种封装状态:

  • 公有こうゆうpublic):類別るいべつてきよう户可以访问、使用しよう该類べつてき此种なり员。
  • 护(protected):该類べつてき衍生類別るいべつ以访问、使用しよう该類べつてき此成员。外部がいぶほどじょだい不可ふか以访问、使用しよう这种なり员。
  • 私有しゆうprivate):ただゆう類別るいべつ自身じしんてきなり员函すう以访问、使用しよう该類べつてき此成员。

一般いっぱん以将C++るいてき外接がいせつこう设定为公有こうゆうなり员;るい内部ないぶ使用しようてきすうすえ函数かんすう设定为私有しゆうなり员;きょう派生はせい该類べつてき類別るいべつ使用しようてきすうすえ函数かんすう设定为保护成员。

繼承けいしょう

编辑

繼承けいしょうInheritanceゆび派生はせい类(subclass繼承けいしょうもと类(superclass),かい自動じどう取得しゅとくちょう類別るいべつじょ私有しゆう特質とくしつ外的がいてき全部ぜんぶ特質とくしつどう一類別的所有實體都會自動有該類別的全部特質,做到ほどしき碼再ようreuse)。C++ただ支援しえん類別るいべつ構成こうせいしき繼承けいしょう,雖然どう一類別的所有實體都有該類別的全部特質,ただし實體じったいのう夠共とおるてき實體じったい成員せいいんただげん成員せいいんはこしき類別るいべつてきにんなん實體じったい資料しりょう成員せいいん乃每實體じったい獨立どくりついち份,いん物件ぶっけんあいだなみ不能ふのうどもとおる狀態じょうたいじょ特質とくしつため參考さんこうがたべつてき屬性ぞくせいある使用しよう指標しひょうらい間接かんせつどもとおる。C++支持しじてき继承关系为:

  • 公有こうゆう繼承けいしょうpublic inheritance):さい常用じょうよう繼承けいしょう关系,含义is-a關係かんけい代表だいひょうりょうざい完全かんぜん使用しよう公有こうゆう繼承けいしょうてき物件ぶっけん類別るいべつあいだてき层次关系(hierarchy)。
  • 保護ほご繼承けいしょうprotected inheritance):基礎きそ類別るいべつてき公有こうゆうある内容ないよう以被衍生類別るいべつ,以及よし此衍せいてき其他類別るいべつ使用しようただし基礎きそ類別るいべつ对外かいよう户是不可ふか见的。衍生類別るいべつてきよう不能ふのう访问基礎きそ類別るいべつてきなり员、不能ふのう派生はせい類別るいべつ转换(造型ぞうけい)为基礎きそ類別るいべつてきゆび针或引用いんよう
  • 私有しゆう繼承けいしょうprivate inheritance):基礎きそ類別るいべつてき公有こうゆうある内容ないよう仅可以被衍生類別るいべつ访问。ただし基礎きそ類別るいべつ对衍生類しょうるいべつてき類別るいべつある衍生類別るいべつてきよう户都不可ふか见的。衍生類別るいべつてき類別るいべつある衍生類別るいべつてきよう户都不能ふのう访问基礎きそ類別るいべつてき内容ないよう不能ふのう衍生類別るいべつ转换为基礎きそ類別るいべつてきゆび针或引用いんよう

C++支持しじ繼承けいしょうmultiple inheritanceMI)。繼承けいしょうmultiple inheritanceMIてきゆう缺點けってん一直廣為使用者所爭議,許多きょたげん(如Javaなみ支援しえん多重たじゅう繼承けいしょう,而改以單いち繼承けいしょうかいめん繼承けいしょうinterface inheritance),而另一些語言则采用用單一繼承和混入(mixin)。C++つうきょ繼承けいしょうVirtual Inheritanceらい解決かいけつ繼承けいしょう带来てきいち系列けいれつ问题。

编辑
Polymorphism

Ad Hoc                   Universal
Overloading   Coercion       Inclusion  Parametric

じょりょうふうそうあずか繼承けいしょうがい,C++かえ提供ていきょうりょうかたこうのう物件ぶっけんしるべむこうてき精神せいしんざい於多态(Polymorphism),一般いっぱんてき态,ゆび動態どうたい态,かかり使用しよう繼承けいしょう動態どうたい绑定(Dynamic Binding實現じつげん使用しようがた建立こんりゅうおこり繼承けいしょう體系たいけいInheritance hierarchy)。るいclassあずか繼承けいしょうただ達成たっせい态中てきいちしゅ手段しゅだん所以ゆえんしょう物件ぶっけんみちびけこう而非類別るいべつしるべむこう

态又ぶんなり靜態せいたい态(Static Polymorphismあずか動態どうたい态(Dynamic Polymorphism)。C++语言支持しじてき動態どうたい必須ひっす結合けつごう繼承けいしょう动态绑定(Dynamic Binding方式ほうしき實現じつげん靜態せいたい态是ゆび编译时决じょうてき态,包括ほうかつじゅう载和以模ばんtemplate實現じつげんがたてき方法ほうほうそくさんすうがたたいParameterized Types),使用しようきょしゅうmacroてきほどじょだい膨脹ぼうちょうほうたちいたかた效果こうか

类型轉換てんかんtype cast)也是一種いっしゅさんすうad hoc态的概念がいねん,C++提供ていきょうdynamic_cast, static_castとう运算らいさく强制きょうせい类型轉換てんかんCoercion)。

運算うんざんもとおもoperator overloadingあるはこしきおもfunction overloading)也算がたてき概念がいねん

分析ぶんせき處理しょりC++原始げんしだい

编辑

C/Java/C#以用ぼうしゅ LR剖析ある其變がた分析ぶんせき文法ぶんぽう[らいみなもと請求せいきゅう]ただしC++著名ちょめいてき例外れいがい:请看下面かめんてきだい码。

#include <vector>
#include <string>
std::vector< std::vector<std::string> >table1;
std::vector<std::vector<std::string>>table2;

上面うわつらてきtable1显然いちくしてきかず,而table2则未必能どおり过编译:如果严格遵循LR分析ぶんせき过程,くし >> かいかい释为みぎうつり运算而非两个代表だいひょうばんさんすうひょう结束てきみぎとんがくくごういん此出现编译错误,必须以table1てき方式ほうしきようそらかく区分くぶん。(ざいC++11发布きさきとく别规ていりょうとう处理ばん时,>>优先视为两个>[28]所以ゆえんtable1table2ひとしどおり过编译.)

そう

编辑

ざい這12ねんうら,C++使用しようしゃ人數にんずう大約たいやくごとなな個月かげつはん增加ぞうかいちばい許多きょたC++相關そうかんぶんけん必引てき一段いちだんばなししか而,いたり今日きょう新語しんごげんそうきゅう使用しようしゃ人數にんずうやめふと可能かのう以如此速度そくど增長ぞうちょう分析ぶんせき機構きこうEvansData定期ていきたい開發かいはつ人員じんいん展開てんかい調ちょう查,其資料しりょう顯示けんじ,以C++ため工具こうぐてき開發かいはつ人員じんいんざいせい開發かいはつかいしょ佔的比例ひれいよし1998ねんはるてんてき76%下降かこういたり2004ねんあきてき46%。

一部分いちぶぶんUnix/Cほどじょ员对C++语言ふか恶痛绝,们批评的理由りゆう如下:

  1. STL以非常ひじょううし陋的方式ほうしきふうそうりょうかく种数すえ结构和算わさんほううつし出来できてきだい码难以理解りかい不美ふみ观。
  2. C++编译复杂不可ふかもたれ适合构建人命じんめい关天类型てきほどじょ
  3. Ian Joyner认为めんこう对象わざ术徒ぞうがく习成ほん如面こう过程てきC语言简单容易ようい使用しようゆう其是ざいけい统软けんてき构建じょう[29]

概括がいかつせつらいUNIXほどしき設計せっけい批評ひひょうC++主要しゅようよしUNIXしゃぐんあずかC++しゃぐんてき文化ぶんか差異さい[30]

Linuxこれちちはやし纳斯·たくかわら曾经つぎ炮轰C++。图灵奖とくぬしあまかつ劳斯·维尔とく也曾经批评C++语言ふとし复杂、语法语义模糊もこ拙劣せつれつ工程こうていがくてき成果せいか

こと实上,对于C++语言てき批评并不只来ただらいげんUnix/Unix-Likeけい统下てきほどじょ员。就像C++语言本身ほんみ一个跨平台的语言一样,对C++てき批评并不局限きょくげんUnix/Unix-Likeけい统用户。

まいり

编辑

参考さんこう文献ぶんけん

编辑
  1. ^ ISO/IEC 14882:2020 Programming languages — C++. 2020ねん12月. 
  2. ^ Stroustrup, Bjarne. Bjarne Stroustrup's FAQ: When was C++ invented?. stroustrup.com. 2010-03-07 [2010-09-16]. (原始げんし内容ないようそん于2016-02-06). 
  3. ^ Stroustrup, Bjarne. Evolving a language in and for the real world: C++ 1991-2006 (PDF). [2019-01-19]. (原始げんし内容ないようそん (PDF)于2007-11-20). 
  4. ^ Stroustrup, Bjarne. A History of C ++ : 1979− 1991 (PDF). [2019-01-19]. (原始げんし内容ないようそん (PDF)于2019-02-02). 
  5. ^ Stroustrup, Bjarne. The C++ Programming Language First. [2010-09-16]. (原始げんし内容ないようそん档于2012-08-09). 
  6. ^ 6.0 6.1 ISO/IEC 14882:2020. [2021-02-25]. (原始げんし内容ないようそん档于2021-06-07). 
  7. ^ Working Draft, Standard for Programming Language C++ (PDF). 2023-05-10 [2023-07-22]. (原始げんし内容ないようそん (PDF)于2023-10-10). 
  8. ^ ISO/IEC TS 21544:2018. [2020-05-10]. (原始げんし内容ないようそん于2020-05-28). 
  9. ^ ISO/IEC TS 19570:2018. [2020-05-10]. (原始げんし内容ないようそん于2020-05-28). 
  10. ^ ISO/IEC TS 19216:2018. [2020-05-10]. (原始げんし内容ないようそん于2020-05-28). 
  11. ^ ISO/IEC 14882:2017. [2017-12-09]. (原始げんし内容ないようそん于2017-12-09). 
  12. ^ ISO/IEC TS 22277:2017. [2017-12-09]. (原始げんし内容ないようそん于2017-12-09). 
  13. ^ ISO/IEC TS 21425:2017. [2017-12-09]. (原始げんし内容ないようそん于2017-12-09). 
  14. ^ ISO/IEC TS 19568:2017. [2017-10-28]. (原始げんし内容ないようそん于2017-10-29). 
  15. ^ ISO/IEC TS 19571:2016. [2017-10-28]. (原始げんし内容ないようそん于2017-10-29). 
  16. ^ ISO/IEC TS 19217:2015. [2017-10-28]. (原始げんし内容ないようそん于2017-10-29). 
  17. ^ ISO/IEC TS 19570:2015. [2017-10-28]. (原始げんし内容ないようそん于2017-10-29). 
  18. ^ ISO/IEC TS 19570:2015. [2015-07-09]. (原始げんし内容ないようそん于2015-07-10). 
  19. ^ ISO/IEC TS 18822:2015. [2015-07-09]. (原始げんし内容ないようそん于2015-07-10). 
  20. ^ ISO/IEC 14882:2014. [2015-01-15]. (原始げんし内容ないようそん于2016-02-25). 
  21. ^ ISO/IEC TR 24733:2011. [2015-07-09]. (原始げんし内容ないようそん于2015-07-09). 
  22. ^ ISO/IEC 14882:2011. [2012-01-03]. (原始げんし内容ないようそん于2016-05-27). 
  23. ^ ISO/IEC TR 29124:2010. [2015-07-09]. (原始げんし内容ないようそん于2015-07-10). 
  24. ^ ISO/IEC TR 19768:2007. [2012-05-13]. (原始げんし内容ないようそん于2016-03-04). 
  25. ^ ISO/IEC TR 18015:2006. [2014-09-25]. (原始げんし内容ないようそん于2016-02-25). 
  26. ^ ISO/IEC 14882:2003. [2012-05-13]. (原始げんし内容ないようそん于2017-01-13). 
  27. ^ ISO/IEC 14882:1998. [2012-05-13]. (原始げんし内容ないようそん于2017-01-15). 
  28. ^ Right Angle Brackets (Revision 2). [2024-03-19]. (原始げんし内容ないようそん于2024-03-02). 
  29. ^ Ian Joynerちょてき《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》だい3しょう51节
  30. ^ Eric RaymondちょてきUnixへんほど藝術げいじゅついちしょだいじゅうよんしょうだいよんせつかたりげんひょう估”

延伸えんしん阅读

编辑

外部がいぶ連結れんけつ

编辑