一、基本的輸入/輸出
1、cin和cout分別istream類和ostream類 的對象,用來實現基本的鍵盤輸入和屏幕輸出。
2、在C++類庫提供的頭文件中已經對“>>”和“<<進行了重載,使之分別作為流提 取運算符和流插入運算符,在C++中,可以使用流提取運算符“>>”從標准輸入設備鍵盤取得數據,使用流插入運算符“<<”從輸出數據。
3、用戶自定義的類型的數據,不能直接用“>>”和“<<”進行輸入/輸出,必須對“>>”和“<<"進行運算 符重載(std)后才可以使用。
格式示例:
cin>>變量1>>變量2>>...變量n; cout<<表達式1<<表達式2<<...<<表達式n;
二、頭文件和命名空間
1、iostream是C++的標准輸入輸出流。當在程序中使用cin或cout時,必須在程序的最前面包含這個流。
2、每條#include指令僅可以包含一個頭文件,如果需要包含多個頭文件,則需要使用多條#include指令。
3、常用的頭文件
標准輸入輸出流:<iostream>
標准文件流:<fstream>
標准字符串處理函數:<string>
標准數學函數:<cmath>
4、#include <iostream>和 #include "iostream"。使用尖括號括住系統提供的頭文件,使用雙引號括住 用戶當前目錄下或指針的目錄查找要包含(程序員自己定義)的頭文件。
5、C++提供了using語句,可以簡化命名空間的寫法。using語句有兩種形式:
usingnamespace 命名空間名; //表示可以在本文件中直接使用指定命名空間內的所有標識符
using 指令也可以用來指定命名空間中的特定項目。例如,如果您只打算使用 std 命名空間中的 cout 部分,可以使用 using std::cout; 方式。隨后的代碼中,在使用 cout 時就可以不用加上命名空間名稱作為前綴,但是 std 命名空間中的其他項目仍然需要加上命名空間名稱作為前綴,如下所示:
#include <iostream>
using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
為了調用帶有命名空間的函數或變量,需要在前面加上命名空間的名稱(如:name::code; // code 可以是變量或函數)
#include <iostream>
using namespace std; // 第一個命名空間
namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // 第二個命名空間
namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // 調用第一個命名空間中的函數
first_space::func(); // 調用第二個命名空間中的函數
second_space::func(); return 0; }
三、關鍵詞
關鍵詞 | 介紹 |
static_cast | static_cast < type-id > ( expression ) 該運算符把 expression 轉換為 type-id 類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
注意 static_cast 不能轉換掉 expression 的 const、volitale、或者 __unaligned 屬性。 |
const | const(常量的,constant)所修飾的對象或變量不能被改變,修飾函數時,該函數不能改變在該函數外面聲明的變量也不能調用任何非const函數。在函數的聲明與定義時都要加上const,放在函數參數列表的最后一個括號后。在 C++ 中,用 const 聲明一個變量,意味着該變量就是一個帶類型的常量,可以代替 #define,且比 #define 多一個類型信息,且它執行內鏈接,可放在頭文件中聲明;但在 C 中,其聲明則必須放在源文件(即 .C 文件)中,在 C 中 const 聲明一個變量,除了不能改變其值外,它仍是一具變量。如: const double pi(3.14159); 或 const double pi = 3.14159; |
const_cast | 該運算符用來修改類型的 const 或 volatile 屬性。除了 const 或 volatile 修飾之外, type_id 和 expression 的類型是一樣的。常量指針被轉化成非常量指針,並且仍然指向原來的對象;常量引用被轉換成非常量引用,並且仍然指向原來的對象;常量對象被轉換成非常量對象。 const_cast<type_id> (expression) |
dynamic_cast | dynamic_cast(動態轉換),允許在運行時刻進行類型轉換,從而使程序能夠在一個類層次結構安全地轉換類型。dynamic_cast 提供了兩種轉換方式,把基類指針轉換成派生類指針,或者把指向基類的左值轉換成派生類的引用。 |
enum | enum(枚舉)類型,給出一系列固定的值,只能在這里面進行選擇一個。 |
explicit | explicit(顯式的)的作用是"禁止單參數構造函數"被用於自動型別轉換,其中比較典型的例子就是容器類型。在這種類型的構造函數中你可以將初始長度作為參數傳遞給構造函數。 |
export | 為了訪問其他編譯單元(如另一代碼文件)中的變量或對象,對普通類型(包括基本數據類、結構和類),可以利用關鍵字 extern,來使用這些變量或對象時;但是對模板類型,則必須在定義這些模板類對象和模板函數時,使用標准 C++ 新增加的關鍵字 export(導出)。 |
extern | extern(外部的)聲明變量或函數為外部鏈接,即該變量或函數名在其它文件中可見。被其修飾的變量(外部變量)是靜態分配空間的,即程序開始時分配,結束時釋放。用其聲明的變量或函數應該在別的文件或同一文件的其它地方定義(實現)。在文件內聲明一個變量或函數默認為可被外部使用。在 C++ 中,還可用來指定使用另一語言進行鏈接,這時需要與特定的轉換符一起使用。目前僅支持 C 轉換標記,來支持 C 編譯器鏈接。使用這種情況有兩種形式: extern "C" 聲明語句 extern "C" { 聲明語句塊 } |
goto | goto(轉到),用於無條件跳轉到某一標號處開始執行。 |
inline | inline(內聯)函數的定義將在編譯時在調用處展開。inline 函數一般由短小的語句組成,可以提高程序效率。 |
namespace | namespace(命名空間)用於在邏輯上組織類,是一種比類大的結構。 |
new | new(新建)用於新建一個對象。new 運算符總是返回一個指針。由 new 創建 |
sizeof | 由於 C++ 每種類型的大小都是由編譯器自行決定的,為了增加可移植性,可以用 sizeof 運算符獲得該數據類型占用的字節數。 |
struct | struct(結構)類型,類似於 class 關鍵字,與 C 語言兼容(class 關鍵字是不與 C 語言兼容的),可以實現面向對象程序設計。 |
template | template(模板),C++ 中泛型機制的實現。 |
typedef | typedef(類型定義,type define),其格式為: typedef 類型 定義名; 類型說明定義了一個數據類型的新名字而不是定義一種新的數據類型。定義名表示這個類型的新名字。 |
typeid | 指出指針或引用指向的對象的實際派生類型。 |
typename | typename(類型名字)關鍵字告訴編譯器把一個特殊的名字解釋成一個類型。在下列情況下必須對一個 name 使用 typename 關鍵字:
|
union | union(聯合),類似於 enum。不同的是 enum 實質上是 int 類型的,而 union 可以用於所有類型,並且其占用空間是隨着實際類型大小變化的。 |
unsigned | unsigned(無符號),表明該類型是無符號數,和 signed 相反。 |
using | 表明使用 namespace。 |
volatile | volatile(不穩定的)限定一個對象可被外部進程(操作系統、硬件或並發線程等)改變,聲明時的語法如下: int volatile nVint; 這樣的聲明是不能達到最高效的,因為它們的值隨時會改變,系統在需要時會經常讀寫這個對象的值。因此常用於像中斷處理程序之類的異步進程進行內存單元訪問。 |
wchar_t | wchar_t 是寬字符類型,每個 wchar_t 類型占 2 個字節,16 位寬。漢字的表示就要用到 wchar_t。 |
四、強制類型轉換運算符
1、當不同類型的量 進行混合算術運算時,系統自動進行合理的類型轉換,也可以在程序中使用強制類型轉換運算符。
系統自動轉換 原則: 低字節向高字節轉換
int a; double b; a+b --> 結果為double類型 ;int 類型4個字節,double 8個字節,低字節向高字節轉換。
2、static_cast用於將一種數據類型轉換成另一種數據類型,一般情況下,static_cast可以缺省。
static_cast <類型名> 表達式
#include <iostream>
using namespace std; int main() { double a = 34.23; cout << (int)a << endl; cout << int(a) << endl; cout << static_cast<int> (a) << endl; return 0; }
結果:
34
34
34
3、const_cast用於去除 指正 和 引用的 常量性,但不能去除 變量的 常量性
const_cast<類型名> (表達式)
功能是將 常量指針轉化成 非常量的指針,並且仍然指向 原來的對象;
或是將 常量引用 轉換成 非常量的引用,並且仍然指向原來的對象。
代碼示例:
#include <iostream>
using namespace std; int main() { int a = 10; // 定義整型變量 a
const int *p = &a; // 定義指針變量 p,存儲變量a的地址,因此 *p便是a的值。
const int ca = 30; //定義整型 ca,用const定義,表示變量的值不許改變。
int *q; //定義整型指針q
cout << "a的地址為:\t" << &a << "\t a的值為: \t" << a << endl; cout << "p指向的地址為:\t" << p << "\t *p的值為:\t" << *p << endl; q = const_cast<int*> (p); //去除p的常量性 賦值給q,如果寫p=q 則會報錯。
*q = 20; cout << "a的地址為:\t" << &a << "\t a的值為: \t" << a << endl; cout << "p指向的地址為:\t" << p << "\t *p的值為:\t" << *p << endl; cout << "q的地址為:\t" << q << "\t *q的值為: \t" << *q << endl; cout << "——————————\t" << endl; p = &ca; //ca的值不能修改
q = const_cast<int*> (p); //去除p的常量性 賦值給q。
*q = 40; cout << "ca的地址為:\t" << &a << "\t ca的值為: \t" << a << endl; cout << "p指向的地址為:\t" << p << "\t *p的值為:\t" << *p << endl; cout << "q的地址為:\t" << q << "\t *q的值為: \t" << *q << endl; system("pause"); // 讓程序停下,按任意鍵繼續
return 0; }
結果:
五、函數參數的默認值
void defaultvalue1(int=2,double=3.0) ;//正確
void defaultvalue2(int a, double b=3.0);//正確
void defaultvalue3(int a=2, double b);//錯誤
void func1(int a, int b=2,intc=3); //正確
void func2(int a=1, int b, int c=3);//錯誤
void func3(int a=1,int b=2,int c);//錯誤
六、引用和函數參數的傳遞
1、引用的定義
* 引用相當於給變量起一個別名。變量對應於某個內存地址,如果給某個變量起了別名,相當於變量和引用都對應到同一個地址。
“引用”的定義格式:
類型名 &引用名 = 同類型的某變量名;
* 系統並不為引用變量分配空間,引用變量與原變量對應的是同一個內存地址,也就是“你變,我就變,我變,你也變”
* 聲明引用變量時,原變量必須初始化。
* 不能有 空引用,即 引用必須指向 某個已存在的內存區域的首地址,也不能聲明引用的引用。如: int &c = &b; ×
int main() { int oneInt = 1; int& ref = oneInt; const int& refc = oneInt; ref = 2; cout << "oneInt=" << oneInt << "," << "ref=" << ref << endl; cout << "refc=" << refc << endl; int& ref2 = ref; cout << "ref2=" << ref2 << endl; return 0; }
結果:
oneInt=2, ref=2 refc=2 ref2=2
2、引用在函數中的使用
引用既可以作為函數的參數使用,也可以作為函數的返回值使用。 C++中,函數調用時參數的傳遞有兩種方式:傳值 和 傳引用
-
- 傳值,傳遞對象的值
如果函數的形參不是引用,那么調用時 實參傳遞給形參 通常采用的時傳值的方式,即 將實參的值拷貝給形參,
函數內部對形參的改變不會影響到函數外實參的值。
這里a,b為局部變量,只是將 a,b的值拷貝給了 形參,但並不影響實參a,b的值,所以結果是a=12,b=18.
-
- 傳引用,傳遞對象的首地址值
如果函數的形參是引用,則調用時實參傳遞給形參采用的是傳引用的方式。函數調用時,實參對象名傳遞給形參對象名,形參對象名就成為實參對象名的別名,
即形參是對應實參的引用,他們是等價,代表同一個對象,也可以看作是將實參的地址傳遞給了形參。
在函數內部對形參的操作,都是對這個地址的內容進行的,相當於對實參的值進行了操作。所以當函數執行完畢返回后,實參的變化被保留下來。
這里的a,b是局部變量,&a引用a,因此b賦值給a的引用,a本身也發生了改變。
-
- 引用作為函數返回值
int & fun(int &c){...}
函數的返回值是一個引用,所以可以作為賦值語句中的左值使用。
即:a 與 x 與 fun(a) 的值都是同一個
七、const與指針共同使用
1、const修飾指針變量時,基本含義:
1)如果唯一的const位於符號*的左側(const int *p = &a;),表示指針所指數據是常量,數據不能通過本指針改變,但可以通過其他方式進行修改;指針本身是變量,可以指向其他的內存單元。
2)如果唯一const位於符號*右側(int * const p = &a;),表示指針本身是常量,不能讓該指針指向其他內存地址;指針所指的數據可以通過本指針進行修改。
3)在符號*的左右各有一個const時,表示指針和指針所指數據都是常量,既不能讓指針指向其他地址,也不能通過指針修改所指向的內容。
const int * p = &a; //指向常量的指針
int * const p = &a; //常量指針
const int * const p = &a; //指向常量的常量指針
九、函數的重載
函數重載,是指在程序的同一范圍內聲明幾個功能類似的同名函數。
①參數個數不同; ②參數類型不同; ③不可以通過函數的返回值類型區分調用 -->
int same(int,double); double same(int ,double;) 無法通過返回值類型來區分是調用的哪一個,所以這兩個不是重載。
十、指針和動態內存的分配
1、指針變量中保存的是一個地址,也成指針指向一個地址。
2、關於空間分配:
-
- 靜態內存分配
- 編譯時確定數組空間大小的方式。
- 動態內存分配
- 在程序運行期間,根據實際需要,臨時分配一段內存空間用於存儲數據。在C++中,使用new運算符實現動態內存分配。 p = new T;
- 使用new運算符還可以動態分配一個任意大小的數組; p = new T[N];
3、使用new運算符動態申請的內存空間,需要在使用完畢后釋放。C++提供了delete運算符,用來釋放動態分配的內存空間。
delete運算符的基本用法:
delete 指針; delete []指針;
十一、用string對象處理字符串
1、C++標准模板庫中提供了string數據類型,專門用於處理字符串。string是一個類,這個類型的變量 稱為“string對象”。
2、要在程序中使用string對象,必須在程序中包含頭文件string,即在程序的最前面,要加上如下語句: #include<string>
string變量名
4、 string對象可以使用cin和cout進行輸入和輸出,還可以使用運算符“+”進行連接。