正文
類
- 輸入運算符 (>>) , 輸出運算符 (<<)
- std是一個類(輸入輸出標準)
using namespace std; //要麼這麼使用
std::cout ; std::cin ; //要麼這麼使用
術語表
- 參數 argument
- 賦值 assignment
- 程序塊 block
- 緩衝區 buffer
- 內置類型 built-in type
- Cerr 一個ostream對象
- 字符串字面值常量
- cin 一個instream對象
- class
- class type
- clog 一個ostream對象 , 通常用於報告程序的執行信息,存入一個日誌文件中
- comnet 註釋
- condition 條件
- cout 一個ostream對象 , 通常用於程序的正常輸出
- { } 程序塊
- header 頭文件, 使類或其他名字的定義可被多個程序使用的一種機制.
- main 每個程序只有一個main函數
- ::運算符 表示命名空間xxx中的名字xxx
- #include 頭文件包含指令 , 使頭文件中代碼可被程序執行
基本數據類型
bool
char
wchar_t
char16_t
char32_t
short
int
long
long long
float
double
long doublesigned和unsigned的區別
unsigned a和unsigned int a等價。singed a和singed int a等價。爲被unsigned修飾的變量賦一個負值得到的結果是最大值加上這個負值再+1。signed b這種情況b的值可以爲負,輸出負數再正常不過。sign沒加ed不能用來修飾類型。
字面值常量
- java : 二進制時用0b10(表示二進制用0b)、010(表示八進制用0)、0x10(表示十六進制用0x)
- C++ : 024 八進制 , 0x / 0X 十六進制 , 20 十進制
字符串字面值結尾處爲一個空字符’\0’ , 字符串字面值實際長度要比他內容多1
指定字面值的類型
前綴u Unicode16字符 char16_t
前綴U Unicode32字符 char32_t
前綴L 寬字符 wchar_t
前綴u8 UTF-8 char
後綴u/U unsigned
後綴l/L long
後綴ll/LL long long
後綴f/F float
後綴l/L long double變量初始化
列表初始化 :
int units_sold = 0; int units_sold = { 0 }; int units_sold{ 0 }; int units_sold( 0 );
變量聲明和定義
變量能且只能被定義一次 , 但是可以被多次聲明
extern int i; // 聲明i int j; //聲明並定義j extern double pi = 3.1416; //定義pi
複合類型
引用(reference) :
引用類型的初始值必須爲一個 對象int ival = 24; int &refVal = ival; //refVal 指向ival
指針(pointer) : 是”指向”另外一種類型的複合類型
- 指針本身就是一個對象, 允許對指針賦值和拷貝 , 在指針的生命週期內它可以先後指向幾個不同的對象.
- 指針無須在定義時初始化.
- 指針類型要和他所指對象嚴格匹配
int *ip1, *ip2; //指針ip1 , ip2 ; int ival = 24; int *p = &ival; //p是指向變量ival的指針
空指針(null pointer) : 不指向任何對象 ;
warn : 使用未初始化的指針是引發運行時錯誤的一大原因.int *p1 = nullptr; int *p2 = 0; int *p3 = NULL; //必須 #include <cstdlib>
引用 訪問的時它最初的綁定對象
指針 給指針賦值就是令他存放一個新的地址 , 從而指向一個全新的對象.
int i = 42; int *pi1 = 0; int *pi2 = &i; int *pi3 = pi2; // 現在指針pi3 和 pi2 都指向i
void* 指針 : 可用於存放任意對象的地址.
double obj = 3.14 , *pd = &obj; void *pv = &obj;
指向指針的指針 :
int ival = 1024; int *pi = &ival; // 指針pi 指向 引用ival int **ppi = π // 指針ppi 指向 指針pi int ***pppi = &ppi; // 指針pppi 指向 指針ppi
指向指針的引用 :
int test() { int i = 42; int *p; int *&r = p; //r是一個對p指針的引用 r = &i; r = 0; //可以直接賦值, 表示p指針指向的引用i , i賦值爲0 }
const 限定符 : 跟java 中 final 關鍵字類似
多個文件之間共享const對象, 須在變量定義之前添加extern(聲明)關鍵字.const 的引用 : 對常量的引用
void testConst() { const int ci = 1024; const int &ri = ci; // 引用及其對應的對象都是常量 }
指向常量的指針 : 不能改變其所指對象的值
void testConst1() { const double pi = 3.15; const double *ptr = π //指針指向一個const常量, 自身也必須是const }
常量指針 : 必須初始化, 一旦初始化完成, 它的值就不能被改變了.
void testConst() { int errNum = 9; int *const curErr = &errNum; // curErr 將一直指向 errNum const double pi = 3.14; const double *const pip = π // pip是一個一直指向常量對象的常量指針 }
頂層const : 表示指針本身是一個常量
底層const : 表示指針所指對象是一個常量
void testConst() { int i = 0; int *const pl = &i; // 這是一個頂層const , 不能改變p1的值 const int ci = 42; // 這是一個頂層const , 不能改變ci的值 const int *p2 = &ci; // 這是一個底層const , 允許改變p2的值 }
常量表達式 : 是指值不會改變並且在編譯過程就能得到計算結果的表達式
void testConst() { const int max_files = 20; //常量表達式 const int limit = max_files + 1; //常量表達式 }
constexpr變量 : 驗證變量的值是否是一個常量表達式.
void testConst() { constexpr int mf = 20; constexpr int limit = mf + 1; }
指針和constexpr : constexpr把它所定義的對象置爲了頂層const
void testConst() { const int *p = nullptr; //p是一個指向整型常量的指針 constexpr int *q = nullptr; //q是一個指向證書的常量指針 }
處理類型 :
類型別名 : 使用 typedef , using 關鍵字
void testAlias() { typedef double wages; //wages 是 double 的同義詞 typedef wages bas, *p; // bas 是 double 的同義詞 , p 是 double* 的同義詞 using SI = Sales_item; // SI 是 Sales_item 的同義詞 typedef char *pstring; const pstring cstr = 0; //cstr是指向char的常量指針 const pstring *ps; // ps是一個指針 , 它的對象是指向char的常量指針 }
auto 類型說明符 : 讓編譯器替我們去分析表達式所屬的類型.
void testAuto() { int i = 2; float p = 1.3; auto sum = i + p; // auto 自動推斷出 i + p 的類型 const int c1 = i, &cr = c1; auto b = c1; // b 是一個整數 auto c = cr; // c 是一個整數 auto d = &i; // d 是一個整型指針 auto e = &c1; // e 是一個指向整數常量的指針 }
decltype 類型指示符 : 選擇並返回操作數的數據類型 , 但卻不實際計算表達式的值. decltype 作用的表達式是一個變量 , 則返回改變量的類型
void testDecltype() { const int ci = 0, &cj = ci; decltype(ci) x = 0; // x 的類型是 const int decltype(cj) y = x; // y 的類型是 const int& , y 綁定到變量x int i = 42, *p = &i, &r = i; decltype(r + 0) b; // b代表一個 int類型 decltype(i) e; // e是一個 int }