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++語言發展大?可以分?三個階段:第一階段從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
argc
,
char
*
argv
[])
{
// ...
}
不?,在一些??器(例如
Visual C++
)上,
也是合法的。但是??的?法兼容性?差。
語言特性
[
??
]
?算符
[
??
]
分?
優先權
|
運算子
|
說明
|
結合性
|
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
。?一個普遍的例子是
?將使用標準庫?文件
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
)、
同一性身分
,?且使用訊息(
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++?言深?痛?,他?批?的理由如下:
- STL以非常丑陋的方式封?了各??据??和算法,?出?的代??以理解、不美?。
- C++??器??和不可?,不适合?建人命?天?型的程序。
- Ian Joyner??
面向?象
技?徒增??成本,不如面向?程的C?言??容易使用,尤其是在系??件的?建上
[29]
。
?括說來
UNIX
程式設計師批評C++主要是由於
UNIX
社群與C++社群的文化差異
[30]
。
Linux
之父
林?斯·托瓦?
曾?多次??C++。
???
得主
尼克?斯·??特
也曾?批?C++?言太??、?法??模糊,是“拙劣工程?”的成果。
事?上,?于C++?言的批??不只?源于
Unix/Unix-Like
系?下的程序?。就像C++?言本身是一?跨平台的?言一?,?C++的批??不局限于
Unix/Unix-Like
系?用?。
參閱
[
??
]
?考文?
[
??
]
延伸??
[
??
]
- Josuttis, Nicolai M. The C++ Standard Library, A Tutorial and Reference Second. Addison-Wesley. 2012.
ISBN
0-321-62321-5
.
- Lippman, Stanley B.; Lajoie, Josee; Moo, Barbara E. C++ Primer Fifth. Addison-Wesley. 2011.
ISBN
0-321-71411-3
.
- [美] Stanley B. Lippman; [美] Josee Lajoie; [美] Barbara E. Moo. C++ Primer(中文版)(第5版). 由王?; ?巨峰??. ?子工?出版社. 2013-09-01.
ISBN
9787121155352
(中文(中?大?))
.
- Meyers, Scott.
Effective C++
Third. Addison-Wesley. 2005.
ISBN
0-321-33487-6
.
- Meyers, Scott.
Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library
. Addison-Wesley. 2001.
- Stroustrup, Bjarne
.
The C++ Programming Language
Fourth ed. Addison-Wesley. 2013.
ISBN
978-0-321-56384-2
.
- Stroustrup, Bjarne
.
The Design and Evolution of C++
. Addison-Wesley. 1994.
ISBN
0-201-54330-3
.
- Stroustrup, Bjarne
.
Programming Principles and Practice Using C++
Second ed. Addison-Wesley. 2014.
ISBN
978-0-321-99278-9
.
- Vandevoorde, David; Josuttis, Nicolai M.
C++ Templates: The complete Guide
. Addison-Wesley. 2003.
ISBN
0-201-73484-2
.
外部連結
[
??
]