C++ 語言是在優化 C 語言的基礎上為支援面向對象的程式設計而研制的一個通用目的的程式設計語言。在後來的持續研究中,C++ 增加了許多新概念,例如虛函數、重載、繼承、标準模闆庫、異常處理、命名空間等。
C++ 語言的特點主要表現在兩個方面:全面相容 C 語言 和 支援面向對象的方法。
1 基礎知識
1.1 擴充名
C語言源檔案的字尾非常統一,在不同的編譯器下都是.c。C++ 源檔案的字尾則有些混亂,不同的編譯器支援不同的字尾,下表是一個簡單的彙總:
編譯器 | Microsoft Visual C++ | GCC(GNU C++) | Borland C++ | UNIX |
---|---|---|---|---|
字尾 | cpp、cxx、cc | cpp、cxx、cc、c++、C | cpp | C、cc、cxx |
通常使用
.cpp
作為 C++ 源檔案的字尾,這樣更加通用和規範。
1.2 注釋符
- 單行注釋://注釋内容
- 塊注釋:
if(x>y)return x;
else return y;
/* 如果 x 大于 y 則傳回 x
否則傳回 y */
注釋符可以放置在代碼的任何位置,且不參與代碼運作。
1.3 頭檔案聲明
最簡單的C++程式往往是下面這樣聲明頭檔案:
//C++中常用寫法
#include < iostream > //引用C++标準頭檔案庫
using namespace std; //使用名字空間
#include
為C/C++中包含頭檔案指令,用于将指定頭檔案嵌入源檔案中。
#include
一般用在 C、C++ 等語系的編譯環境(程式設計軟體的程式設計代碼)中,也即告訴你,在這個地方要插入一堆代碼,而這堆代碼在另一個檔案裡。
iostream
是 C++ 的一個頭檔案庫,在安裝 C++ 環境的時候就已安裝于電腦中,隻需要用 include 将該它包含進來,就可以使用它的代碼。
C++已把标準C++庫的元件放在一個名位 std 的 namespace 裡面中,如果include頭檔案的時候加上.h,預設有
using namespace
,否則需要自己加上
using namespace std
。
是以若沒有第二行語句,cout 就會沒有定義,除非使用 cout 時寫成
std::cout
,即指明其來自空間std 。
按照 C 語言規則聲明則是下面這樣:
不加.h的是現在 C++ 中規定的标準,目的在于使C++代碼用于移植和混合嵌入時不受擴充名 .h 的限制,避免因為.h而造成的額外的處理和修改。而加.h是c語言的用法,但是在c++中也支援這種用法,主要是為了向下相容c 的内容,平時盡量不用這種方法 。
在C++程式中,頭檔案不再以“.h”結尾,一些在C語言中常用的頭檔案在C++中的名字變為去掉“.h”,并在開頭增加字元 c 。例如:
#include < cstdio > //标準化後經過改造的C标準庫,所有的元件都放在了std中
#include < cstring > //C++标準庫下,基于char* 的字元處理函數庫
#include < string > //增加了C++類的字元處理函數庫
#include < cstdlib >
#include < bits/stdc++.h> //号稱萬能庫,在大部分情況下使用這一行就可以省去其他庫的生聲明
<stdio.h>是以往 C 和 C++ 的頭檔案,是标準C++(STL)函數庫中的頭檔案,且 cstdio 中的函數都定義在一個名稱空間 std 裡面,如果要調用這個名字空間的函數,須加
std::
或者在檔案中聲明
using namespace std
。
<string.h> 是标準C提供的字元處理函數集。面向char *.。 是C++為相容C提供的 <string.h> 的C++版本,裡面的主要改進有:将一些隐藏變量編入命名空間;修正一些C++編譯器認為Bug的代碼。
<stdlib.h>可以提供一些函數與符号常量,是C++為相容C提供的版本。
1.4 命名空間
命名空間裡面包含了邏輯結構上互相關聯的一組類、函數、模闆等。命名空間像是一個容器,把某些在邏輯結構上相關的 “對象” 放在一起并與外界區分。特别的,命名空間裡的變量名或類名可以和命名空間外的變量名或類名重名。
使用命名空間的時候,我們可以用 花括号 把聲明塊括起來,再以關鍵字 namespace 開頭并命名,其基本格式如下:
namespace 命名空間的名字
{
聲明塊
}
``
其中聲明塊中可以包含變量、類、函數等。例如:
```cpp
namespace S
{
int x;
void FunA()
{
...
}
}
在命名空間外使用命名空間内的成員:命名空間的名字加上作用域運算符
::
。
參考上例 namespace S,若通路 x,可寫成
S::x
;通路
FunA()
則為
S::FunA()
。
命名空間的嵌套, 具有分層屏蔽的作用。例如:
namespace S1
{
namespace S2
{
int x;
void FunA()
{
...
}
}
}
若要通路 x,則可寫為
S1::S2::x
,同理,通路 FunA() 則可寫為
S1::S2::FunA()
。
using 聲明:若命名空間内的某個成員使用了 using 聲明,那麼這個成員在程式的後續使用中,可直接使用成員名,無需添加限定修飾名。使用 using 聲明:以關鍵字 using 開頭後跟命名空間内的成員名。參考上例嵌套的命名空間:
namespace S2 中 int x 的 using 聲明為:
using S1::S2::x
;
注意: using namespace 後不能加類名或變量名。同上,若 namespace S2 中 int x 的 using 聲明寫為
using namespace S1::S2::x
便是錯誤的。
using 訓示符可以一次性地使命名空間内的全體成員被直接使用。using 訓示符的使用: 以關鍵字
using namespace
開頭後跟命名空間名字。特别的,std 命名空間聲明和定義了标準 C++ 庫中的所有元件,使用
using namespace std
; 則可使用标準 C++ 庫中的所有成員。
1.5 輸入與輸出
C++ 标準 I/O 庫包含 iostream、fstream 和 sstringstream。iostream、fstream 比較常用,一般操作于輸入和輸出,相較于前兩者來說 sstringstream 的出現頻率就低了許多,一般操作于資料的格式化。為了能更好的了解 C++ 語言的标準 I/O 庫,我們參考 cplusplus 官網 的相關内容,整理注釋了一份關于輸入輸出流類繼承體系的關系圖:
1. 标準輸出流對象 cout
預定義的插入符 “ << ” 作用在流類對象 cout 上可實作最基本的螢幕輸出,其格式為:
在輸出語句中,若串聯多個插入符,則可輸出多個資料項。例如:
則依次輸出 a,b,c 三個資料項的值。
若插入符後面是複雜的表達式,則系統自動計算其表達式的值并傳給插入符。例如:
依次輸出字元串 “ a+b= ” 以及 a+b 的計算結果。
2. 标準輸入流對象 cin
預定義的提取符 “ >> ” 作用在流類對象 cin 上可實作對鍵盤輸入的提取操作,其格式為:
其中表達式通常用于存放輸入值的變量。例如:
int a,b;
cin >> a >> b;
即編譯執行後,輸入 a 和 b 的值,a 和 b 之間使用空格分隔。如輸入:1 2,則給 a 指派為 1,b 指派為 2。
3. 簡單的 I/O 格式控制
一般情況下,使用 cin 和 cout 進行資料的輸入和輸出時,會自動按照預設的格式進行處理。如若需要設定特殊的格式,可利用 C++ I/O 流類庫提供的操縱符進行調整。這些操縱符可直接嵌入到輸入輸出語句中實作格式控制。常用的 I/O 流類庫操縱符,請閱讀:C++ 基本的輸入輸出
1.6 編譯和運作C++程式
C/C++ 代碼生成可執行檔案的過程:
我們常見的編譯器有兩個:
- gcc 編譯器
-
g++ 編譯器
gcc和g++都是GNU(組織)的編譯器。
程式 g++ 是将 gcc 預設語言設為 C++ 的一個特殊的版本,連結時它自動使用 C++ 标準庫而不用 C 标準庫。通過遵循源碼的命名規範并指定對應庫的名字,用 gcc 來編譯連結 C++ 程式是可行的,如下例所示:
$ gcc main.cpp -lstdc++ -o main
建立一個helloworld.cpp檔案,最簡單的編譯方式:
$ g++ helloworld.cpp
由于指令行中未指定可執行程式的檔案名,編譯器采用預設的 a.out。程式可以這樣來運作:
$ ./a.out
Hello, world!
通常我們使用 -o 選項指定可執行程式的檔案名,以下執行個體生成一個 helloworld 的可執行檔案:
$ g++ helloworld.cpp -o helloworld
執行 helloworld:
$ ./helloworld
Hello, world!
如果是多個 C++ 代碼檔案,如 runoob1.cpp、runoob2.cpp,編譯指令如下:
$ g++ runoob1.cpp runoob2.cpp -o runoob
生成一個 runoob 可執行檔案。
g++ 有些系統預設是使用 C++98,我們可以指定使用 C++11 來編譯 main.cpp 檔案:
g++ -g -Wall -std=c++11 main.cpp
g++ 常用指令選項:請閱讀:g++ 常用指令選項
gcc和g++編譯器的差別
g++:會把.c和.cpp的檔案都當作是C++的源程式進行編譯。
gcc:會把.c的程式當作是C的源程式進行編譯,.cpp 的程式當作是C++的源程式進行編譯
參考
- C++語言:https://www.lanqiao.cn/courses/2752/learning/?id=47676&compatibility=false
- 從C到C++:http://c.biancheng.net/view/2191.html
- C++基礎:https://www.runoob.com/cplusplus/cpp-environment-setup.html
- 頭檔案聲明:https://blog.csdn.net/weixin_39737764/article/details/
- gcc編譯:https://blog.csdn.net/weixin_41010198/article/details/117523288