1 數(shù)據(jù)類型
枚舉類型
枚舉類型
枚舉類型(enumeration)是C++中的一種派生數(shù)據(jù)類型缰雇,它是由用戶定義的若干枚舉常量的集合。
如果一個(gè)變量只有幾種可能的值,可以定義為枚舉(enumeration)類型。所謂"枚舉"是指將變量的值一一列舉出來(lái)沙绝,變量的值只能在列舉出來(lái)的值的范圍內(nèi)。
創(chuàng)建枚舉鼠锈,需要使用關(guān)鍵字 enum闪檬。枚舉類型的一般形式為:
enum enum-name { list of names } var-list;
在這里,enum-name 是枚舉類型的名稱购笆。名稱列表 { list of names } 是用逗號(hào)分隔的粗悯。
例如,下面的代碼定義了一個(gè)顏色枚舉同欠,變量 c 的類型為 color样傍。最后,c 被賦值為 "blue"行您。
enum color { red, green, blue } c;
c = blue;
默認(rèn)情況下,第一個(gè)名稱的值為 0剪廉,第二個(gè)名稱的值為 1娃循,第三個(gè)名稱的值為 2,以此類推斗蒋。但是捌斧,您也可以給名稱賦予一個(gè)特殊的值笛质,只需要添加一個(gè)初始值即可。例如捞蚂,在下面的枚舉中妇押,green 的值為 5。
enum color { red, green=5, blue };
2 const 關(guān)鍵字
您可以使用 const 前綴聲明指定類型的常量姓迅,如下所示:
const type variable = value
例子:
#include <iostream>
using namespace std;
int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
請(qǐng)注意敲霍,把常量定義為大寫字母形式,是一個(gè)很好的編程實(shí)踐丁存。
3 C++ 中的類型限定符
類型限定符提供了變量的額外信息肩杈。
限定符 | 含義 |
---|---|
const | const 類型的對(duì)象在程序執(zhí)行期間不能被修改改變。 |
volatile | 修飾符 volatile 告訴編譯器解寝,變量的值可能以程序未明確指定的方式被改變扩然。 |
restrict | 由 restrict 修飾的指針是唯一一種訪問(wèn)它所指向的對(duì)象的方式。只有 C99 增加了新的類型限定符 restrict聋伦。 |
4 C++ 存儲(chǔ)類
存儲(chǔ)類定義 C++ 程序中變量/函數(shù)的范圍(可見性)和生命周期夫偶。這些說(shuō)明符放置在它們所修飾的類型之前。下面列出 C++ 程序中可用的存儲(chǔ)類:
- auto
- register
- static
- extern
- mutable
- thread_local (C++11)
從 C++ 11 開始觉增,auto 關(guān)鍵字不再是 C++ 存儲(chǔ)類說(shuō)明符兵拢,且 register 關(guān)鍵字被棄用。
4.1 static 存儲(chǔ)類
static 存儲(chǔ)類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在抑片,而不需要在每次它進(jìn)入和離開作用域時(shí)進(jìn)行創(chuàng)建和銷毀卵佛。因此,使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值敞斋。
static 修飾符也可以應(yīng)用于全局變量截汪。當(dāng) static 修飾全局變量時(shí),會(huì)使變量的作用域限制在聲明它的文件內(nèi)植捎。
在 C++ 中衙解,當(dāng) static 用在類數(shù)據(jù)成員上時(shí),會(huì)導(dǎo)致僅有一個(gè)該成員的副本被類的所有對(duì)象共享焰枢。
#include <iostream>
// 函數(shù)聲明
void func(void);
static int count = 10; /* 全局變量 */
int main()
{
while(count--)
{
func();
}
return 0;
}
// 函數(shù)定義
void func( void )
{
static int i = 5; // 局部靜態(tài)變量
i++;
std::cout << "變量 i 為 " << i ;
std::cout << " , 變量 count 為 " << count << std::endl;
}
結(jié)果如下:
變量 i 為 6 , 變量 count 為 9
變量 i 為 7 , 變量 count 為 8
變量 i 為 8 , 變量 count 為 7
變量 i 為 9 , 變量 count 為 6
變量 i 為 10 , 變量 count 為 5
變量 i 為 11 , 變量 count 為 4
變量 i 為 12 , 變量 count 為 3
變量 i 為 13 , 變量 count 為 2
變量 i 為 14 , 變量 count 為 1
變量 i 為 15 , 變量 count 為 0
4.2 extern 存儲(chǔ)類
extern 存儲(chǔ)類用于提供一個(gè)全局變量的引用蚓峦,全局變量對(duì)所有的程序文件都是可見的。當(dāng)您使用 'extern' 時(shí)济锄,對(duì)于無(wú)法初始化的變量暑椰,會(huì)把變量名指向一個(gè)之前定義過(guò)的存儲(chǔ)位置。
當(dāng)您有多個(gè)文件且定義了一個(gè)可以在其他文件中使用的全局變量或函數(shù)時(shí)荐绝,可以在其他文件中使用 extern 來(lái)得到已定義的變量或函數(shù)的引用一汽。可以這么理解低滩,extern 是用來(lái)在另一個(gè)文件中聲明一個(gè)全局變量或函數(shù)召夹。
extern 修飾符通常用于當(dāng)有兩個(gè)或多個(gè)文件共享相同的全局變量或函數(shù)的時(shí)候岩喷,如下所示:
第一個(gè)文件:main.cpp
#include <iostream>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二個(gè)文件:support.cpp
#include <iostream>
extern int count;
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
4.3 mutable 存儲(chǔ)類
mutable 說(shuō)明符僅適用于類的對(duì)象,這將在本教程的最后進(jìn)行講解监憎。它允許對(duì)象的成員替代常量纱意。也就是說(shuō),mutable 成員可以通過(guò) const 成員函數(shù)修改鲸阔。
4.4 thread_local 存儲(chǔ)類
使用 thread_local 說(shuō)明符聲明的變量?jī)H可在它在其上創(chuàng)建的線程上訪問(wèn)偷霉。 變量在創(chuàng)建線程時(shí)創(chuàng)建,并在銷毀線程時(shí)銷毀隶债。 每個(gè)線程都有其自己的變量副本腾它。
thread_local 說(shuō)明符可以與 static 或 extern 合并。
可以將 thread_local 僅應(yīng)用于數(shù)據(jù)聲明和定義死讹,thread_local 不能用于函數(shù)聲明或定義瞒滴。
以下演示了可以被聲明為 thread_local 的變量:
thread_local int x; // 命名空間下的全局變量
class X
{
static thread_local std::string s; // 類的static成員變量
};
static thread_local std::string X::s; // X::s 是需要定義的
void foo()
{
thread_local std::vector<int> v; // 本地變量
}
5 C++ 運(yùn)算符
運(yùn)算符是一種告訴編譯器執(zhí)行特定的數(shù)學(xué)或邏輯操作的符號(hào)。C++ 內(nèi)置了豐富的運(yùn)算符赞警,并提供了以下類型的運(yùn)算符:
- 算術(shù)運(yùn)算符
- 關(guān)系運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
- 賦值運(yùn)算符
- 雜項(xiàng)運(yùn)算符
6 C++引用
引用變量是一個(gè)別名妓忍,也就是說(shuō),它是某個(gè)已存在變量的另一個(gè)名字愧旦。一旦把引用初始化為某個(gè)變量世剖,就可以使用該引用名稱或變量名稱來(lái)指向變量。
6.1 C++ 引用 vs 指針
引用很容易與指針混淆笤虫,它們之間有三個(gè)主要的不同:
- 不存在空引用旁瘫。引用必須連接到一塊合法的內(nèi)存。
- 一旦引用被初始化為一個(gè)對(duì)象琼蚯,就不能被指向到另一個(gè)對(duì)象酬凳。指針可以在任何時(shí)候指向到另一個(gè)對(duì)象。
- 引用必須在創(chuàng)建時(shí)被初始化遭庶。指針可以在任何時(shí)間被初始化宁仔。
6.2 C++ 中創(chuàng)建引用
試想變量名稱是變量附屬在內(nèi)存位置中的標(biāo)簽,您可以把引用當(dāng)成是變量附屬在內(nèi)存位置中的第二個(gè)標(biāo)簽峦睡。因此翎苫,您可以通過(guò)原始變量名稱或引用來(lái)訪問(wèn)變量的內(nèi)容。例如:
int i = 17;
我們可以為 i 聲明引用變量榨了,如下所示:
int& r = i;
引用通常用于函數(shù)參數(shù)列表和函數(shù)返回值煎谍。下面列出了 C++ 程序員必須清楚的兩個(gè)與 C++ 引用相關(guān)的重要概念:
概念 | 描述 |
---|---|
把引用作為參數(shù) | C++ 支持把引用作為參數(shù)傳給函數(shù),這比傳一般的參數(shù)更安全龙屉。 |
把引用作為返回值 | 可以從 C++ 函數(shù)中返回引用呐粘,就像返回其他數(shù)據(jù)類型一樣。 |
7 C++ 日期 & 時(shí)間
C++ 標(biāo)準(zhǔn)庫(kù)沒(méi)有提供所謂的日期類型。C++ 繼承了 C 語(yǔ)言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù)事哭。為了使用日期和時(shí)間相關(guān)的函數(shù)和結(jié)構(gòu),需要在 C++ 程序中引用 <ctime> 頭文件瓜富。
有四個(gè)與時(shí)間相關(guān)的類型:clock_t鳍咱、time_t、size_t 和 tm与柑。類型 clock_t谤辜、size_t 和 time_t 能夠把系統(tǒng)時(shí)間和日期表示為某種整數(shù)。