3.1 文字常量
- 字符型char,通常用來表示單個字符和小整數
- 整型int、短整型short、長整型long
- 浮點型float、雙精度double和長雙精度long double
文字常量:“文字”是因爲只能以它指的形式指代它,“常量”是因爲它的值不能被改變。
每個文字常量都有相對應的類型,且都是不可尋址的。
整數文字常量的三種形式:十進制、八進制(前面加一個0)、十六進制(前面加0x)
默認,整型文字常量被當做是一個int型的有符號值,文字常量後加“L”,將其指定爲long類型,也可以在整型文字常量後加“U”,指定它爲無符號數。擴展精度用“L”表示。
科學計數法:“f”“F”“L”“l”只能用在十進制中。
寬字符:字符常量前加“L”,例如:L”a”。類型爲wchar_t。
如果兩個字符串或寬字符串在程序中相鄰,C++會把它們連接在一起,並在最後加上一個空字符。注意:不要將一個字符串與寬字符串連接。
3.2 變量
變量和文字常量都有存儲區,也有相關的數據類型,區別是變量時可尋址的。
對於一個變量,
- 它的數據值,存儲在某個地址中。——右值。文字常量和變量都可以用作右值。
- 它的地址值,數據存放的內存地址。——左值,文字常量不能用作左值。
一個簡單的定義指定了變量的類型和標示符,它並不提供初始值。如果一個變量是全局變量,那麼系統會保證提供初始值給該變量。未初始化的對象不是沒有值,而是它的值是未定義的。(與它關聯的內存區含有一個隨機的位串,可能是以前使用的結果)
C++初始化的兩種方式:
- 使用賦值操作符
- 初始值放在標示符後的括號中,例如:int ival(20);
- 每種內置數據類型都支持一種特殊的構造函數語法,可將對象初始化爲0。例如:int val=int(); double dVal = double();
3.3 指針
指針變量最好寫成:string *fp ; 解引用符號挨着標識符。
當指針爲0值時,表示沒有指向任何對象。指針不能持有非地址值,指針不能被初始化或賦值爲其他類型對象的地址值。
空(void*)類型指針,可以被任何數據指針類型的地址值賦值(函數指針不能賦值給它)。void*表示相關的值是地址,但該地址的對象類型未知,我們不能操作空類型指針所指向的對象,只能傳送該地址值或將它與其他地址值做比較。
指針的算術運算符(增加或減少)
加法:針對指針的加法總是認爲是數據對象的加法,而不是離散的十進制加法。例如:指針加2表示給指針持有的地址增加了該類型兩個對象的長度。
3.4 字符串類型
C++提供兩種字符串的表示:C風格的字符串和標準C++引入的string類型。建議使用string類。
要使用C++標準庫的string類型,需要加入#include <string>
3.5 const限定修飾符(重要)
const類型限定符將一個對象轉換成一個常量。因爲常量在定義後就不能被修改,所以必須進行初始化。任何“試圖將一個非const對象的指針指向一個常量對象”à編譯錯誤。
const double *cptr ;
cptr是一個指向double類型的const對象指針。讀爲:cptr是一個指向double類型的、被定義成const的對象指針。但cptr本身不是常量,可以重新複製給cptr,但不能修改cptr所指向的對象。const對象的地址只能賦值給指向const對象的指針,但是指向const對象的指針可以被賦予一個非const對象的地址。指向const的指針常被用作函數的實參。
int errNumb = 0 ;
int *const curErr = &errNumb;
curErr是一個指向int類型對象的const指針。不能賦給curErr其他的地址值,但可以修改curErr指向的值。
3.6 引用類型
引用有時候又稱爲別名(alias)。
定義方式:
int iVal = 1024;
int &refVal = iVal;——refVal是一個指向iVal的引用。引用必須初始化爲指向一個對象。
int *pi = &iVal;
int *&ptrVal2 = pi;——ptrVal2是一個指向int指針的引用。引用一旦已經定義,就不能再指向其他對象。引用的所有操作實際上都被應用在它所指的對象上,包括取地址符。
const引用可以用不同類型的對象初始化(只要能從一種類型轉換到另一種類型即可),也可以是不可尋址的值,如文字常量。不允許非const引用指向需要臨時對象的對象或值。
double dval = 3.14159;
// 僅對於const引用纔有效
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval + 1.0;
實際的C++程序很少使用指向獨立對象的引用類型。引用類型主要被用作函數的形參和作爲返回值。
3.7 布爾類型
布爾類型:true/false。當表達式需要一個算術值時,布爾對象和布爾常量都被隱式提升爲int:false變成0,true變成1。
3.8 枚舉類型
enum open_modes{ input = 1, output, append};
C++不支持在枚舉成員之間的前後移動。在缺省情況下,第一個枚舉成員被賦以0,後面的每個枚舉成員依次比前面的大1。也可以顯示地把一個值賦給一個枚舉成員,這個值不必是唯一的。
// point2d = 2, point2w = 3, point3d = 3, point3w = 4
enum Points{ point2d = 2, point2w, point3d = 3, point3w};
枚舉類型可以參與表達式運算,可以作爲參數傳遞給函數,也可以被初始化,但只能被一個相同枚舉類型的對象或者枚舉成員之中的某個值初始化或賦值。
3.9 數組類型
字符數組可以用一個由逗號分開的字符文字列表初始化,文字列表用花括號闊起來,或者用一個字符串文字初始化。注意:這兩種方式是不等價的,字符串常量包含一個額外的終止空字符。例如:
const char ca1[] = {‘C’, ‘+’, ‘+’};
const char ca2[] = “C++”;
一個數組不能被另外一個數組初始化,也不能被賦值給另外一個數組。而且,C++不允許聲明一個引用數組(由引用組成的數組)。
3.10 vector容器類型
與string類一樣,vector類是隨標準C++引入的標準庫的一部分。爲了使用vector,必須包含#include <vector>。
兩種形式:
1、數組習慣:vector<int> ivec(10);與int ivec[10]相似。訪問vector元素與內置數組一致。
2、STL習慣:vector<int> ivec;定義一個空vector,再向vector中插入元素。例如:push_back()插入元素。使 用vector的begin()和end()所返回的迭代器(iterator)進行循環。iterator是標準庫的類,具有指針的功能。
3.11 typdef 名字
typedef提供了一種通用的類型定義設施,可以用來爲內置的或用戶定義的數據類型引入助記符號。typedef定義以關鍵字typedef開始,後面是數據類型和標識符。
考慮:typedef char *cstring;
extern const cstring cstr;
請問:cstr的類型是什麼?
答:char *const cstr。const修飾的是cstr類型,cstr是一個指針,所以這個定義聲明瞭cstr是一個指向字符的const指針。
3.12 volatile限定修飾符
當一個對象的值可能會在編譯器的控制或檢測之外被改變,例如:一個被系統時鐘更新的變量,那麼該對象應該聲明爲volatile。因此,編譯器執行的某些例行優化行爲不能應用在已指定爲volatile的對象上。volatile修飾符的主要目的是提示編譯器,該對象的值可能在編譯器未檢測到的情況下被改變,因此編譯器不能武斷地對引用這些對象的代碼做優化處理。
3.14 pair類型
pair使得我們可以在單個對象內把相同類型或不同類型的兩個值關聯起來。爲了使用pair類,必須包含#include <utility>。
pair<string, string> author(“James”, “Joyce”);
author.first == “James” && author.second == “Joyce”
如果希望定義大量相同pair類型的對象,最方便的做法就是使用typedef。