한국   대만   중국   일본 
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

C++ 是一?被?泛使用的?算机程序???言。?是一?通用 程式設計語言 ,支援 多重?程范式 ,例如 過程化程序設計 面向?象程序設計 泛型程式設計 函?式程序設計 等。

比雅尼·斯特勞斯特魯普 博士在 ????室 工作期?在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 ?型的重?)。?使得C和C++的?准???常常被一?提供,在核心?言???大一部分兼容的情?下,?一步?保用?通常?容易把符合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?准??是??于??器?目之外提供的,如 glibc musl 。C++?准?的??也可能支持多???器,如GCC的libstdc++?支持GCC的g++和LLVM Clang的clang++。?些不同的?富?合使市面上的C++?境具有?多??上的??差?,因而遵循ISO C++??的?威?准??持可移植性?得更加重要。?今??的C++?言,除非?行指明,通常均指ISO C++??定?的C++?言(?然因???的差?,可能不一定是最新的正式版本)。

?得注意,和流行的?解不同,ISO C和ISO C++都?未明?要求源程序被 ??(compile) ,而?要求 ??(translate) ,因此C和C++?不是所?的 ??型 ?言。技?上,??C和C++程序的?位是???元(translation unit)。作??比, Java ?言?范中就明?要求Java程序被????,明?存在???元(compilation unit)。??上C和C++也存在 REPL 形式的 解?器 ??,如 CINT Cling 。但因???上C和C++多以??器??,??上仍有一些混用,甚至至今仍出?在ISO C++ 某??准??款的?? ?面存??? ,存于 互???案? )上。

??上,C++?言被??和C?言??性能相近的?言,强??行?的高效。根據《C++編程思想》( Thinking in C++ )一書,C++與C的代??行效率往往相差在±5%之間 [2]

?展?史 [ ?? ]

比雅尼·史特勞斯特魯普 ,C++之父

C++語言發展大?可以分?三個階段:第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的 面向?象 語言,?且憑藉着接近C語言的效率,在工業界使用的開發語言中?據了相當大?額;第二階段從1995年到2000年,這一階段由於 標準模板庫 和後來的 Boost 等程式庫的出現, 泛型程序設計 在C++中?據了越來越多的比重。當然,同時由於 Java C# 等語言的出現和硬體價格的大規模下降,C++受到了一定的衝擊;第三階段從2000年至今,由於以 Loki MPL(Boost) 等程式庫?代表的 ?生式編程 模板元編程 的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成?當今主流程序設計語言中最複雜的一員。

比雅尼·史特勞斯特魯普 工作起於1979年的 C with Classes 。這個構思起源於斯特?斯特?普做博士論文時的一些程式撰寫經驗。他發現 Simula 具備?利於大型軟體開發的特點,但 Simula 的執行速度太慢,無法對現實需求發揮功效; BCPL 雖快得多,但?過於低階的特性,使其不適於大型軟體的開發。當斯特?斯特?普開始在 貝爾實驗室 工作時,他有分析 UNIX 核心 關於 分散式計算 的問題。回想起他的博士論文經驗,斯特?斯特?普開始?C語言增?一些類似 Simula 的特點 [3] 。之所以選擇C,是因??適於各種用途、快速和 可移植 性。除了C?言和 Simula 之外,同時也從其?語言中取得靈感,如 ALGOL 68 Ada CLU 以及 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函式,如 printf scanf 。隨後所引入的程式庫中最重要的便是 標準模板庫 ,簡稱 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++。?提供了實用的工具,如 容器? (如: Array Vector ), 迭代器 (廣義 指? )提供容器以類似陣列的存取方式,以及 泛型 算法 進行搜尋和排序的運算。此外還提供了(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 常量表?式、?型?理?算符(?型?名及 auto decltype 等多??型指示符)、C++?准?( IO ??多?容器?)?迭代器、???存?智能指?、函?重載、面向?象程序??(如?据抽象、成員函?、?作用域、?造函??析?函?、??成?、??控制?繼承、?函?、抽象??接口等)、拷?控制、?算符重?、造型?函??格的?制?型??、模板?泛型?程,以及異常處理、命名空間、多?承???承、?行??型??及嵌套?等。

C++在某些案例中(見下「與C不相容之處」),進行比C還要多的類型檢?。

以「 // 」起始作?註解起源自C的前身 BCPL ,而後被重新引入到C++。

C++的一些特性,C不久之後也採用了,包括在 for 循?的括?中?明,C++風格的註解(使用 // 符號,和 inline ,雖然C99定義的 inline 關鍵字與C++的定義不相容。不過, C99 也引入了不存在於C++的特性,如:可??? 巨集 ,和以陣列作?參數的較佳處理;某些C++編譯器可能實作若干特性,以作?擴展,但其餘部分?不符合現存的C++特性)

一個常見的混淆其實只是一個微妙的術語問題:由於?的演化來自C,在C++中的術語 ?象 和C語言一樣是意味著 記憶體區域 ,而不是 類別的實體 ,在其??大多數的 物件導向 語言也是如此。?例來說,在C和C++中,語句 int i; 定義一個 int 型別的物件,這就是變數的? i 將在指派時,所存入的記憶體區域。

C++?言中的 const ??字 [ ?? ]

const 是一?C和C++?言的??字,意思是?明一個不能改變?的?量,?只?。使用 const 在一定程度上可以提高程序的安全性和可?性,也便于???此?行?化(如把只??象放入 ROM 中)。 const 作?型別限定符,是型別的一部分。

C++不是第一個正式引入 const ?型的?言。80年代早期, Bjarne Stroustrup Dennis 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引入了更?格的 consteval constinit 的?法,直接限定特定的求?必?在???完成。不?,和 const 不同,后三者修??明但不是 ?型限定符 ,不???型?明?成?合?型,不通? ?型?? ??所?的const正?性(const correctness),也不影?利用?些特性的相? API ?型?名

一些?照C和C++??的?言中,也存在?似的差?。例如,C#同?具有 readonly const ??字,前者接近原始的“只?”(?最先被??的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
);

但要使其在C和C++ ?者 皆能?作,就需要使用?式??:

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

?一?常?的 可移植 問題是,C++定?了?多的新??字,如 new class ,??在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 的泛型程式設計。?采用 typename class ????字,???模板類別的型別??。 C++11 C++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 Type ADT ),繼承、多型、模板都加?了類別的可抽象性。在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 inheritance MI )。多繼承( multiple inheritance MI )的優缺點一直廣?使用者所爭議,許多語言(如 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] ,所以table1和table2均可通???.)

?? [ ?? ]

「在這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編程藝術 》一書第十四章第四節“語言評?”

延伸?? [ ?? ]

外部連結 [ ?? ]