學習一門編程語言,首先要熟悉它的類型系統。如果你連它存在哪些數據類型都不瞭解,還談什麼使用語言來編程呢。而且,大多數常用編程語言的類型基本是比較一致的。另外,一門編程語言,一般來說,是有一組保留的關鍵字,它們在程序中具有特殊的含義。我經過整理,把C++相關的數據類型及其部分保留關鍵字,及其基本修飾符,都列舉出來。當然,這些在實際編程實踐中,就會慢慢熟悉。
第一部分:數據類型
1、基本類型
C++語言中基本類型,如下表所示:
類型標識符 |
類型說明 |
長度 |
範圍 |
備註 |
char | 字符型 | 1 | -128 ~ 127 | -27 ~ (27 -1) |
unsigned char | 無符字符型 | 1 | 0 ~ 255 | 0 ~ (28 -1) |
short int | 短整型 | 2 | -32768 ~ 32767 | 2-15 ~ (215 - 1) |
unsigned short int | 無符短整型 | 2 | 0 ~ 65535 | 0 ~ (216 - 1) |
int | 整型 | 4 | -2147483648 ~ 2147483647 | -231 ~ (231 - 1) |
unsigned int | 無符整型 | 4 | 0 ~ 4294967295 | 0 ~ (232-1) |
float | 實型(單精度) | 4 | 1.18*10-38 ~ 3.40*1038 | 7位有效位 |
double | 實型(雙精度) | 8 | 2.23*10-308 ~ 1.79*10308 | 15位有效位 |
long double | 實型(長雙精度) | 10 | 3.37*10-4932 ~ 1.18*104932 | 19位有效位 |
2、布爾類型
布爾類型使用關鍵字bool來聲明布爾變量,它的取值爲true和false。
3、枚舉類型
枚舉類型定義了一組整型常量(const int),使用enum關鍵字定義。這組常量具有一個名字,你可以命名爲能夠理解的常量名稱,便於理解。而對於枚舉類型的每個成員,都是一個int型的值,而且是按照定義的順序以1遞增,即初始的枚舉成員可以指定初始值,之後的每個枚舉成員都依次加1。
4、字符串類型
C++中具有兩種定義字符串的風格,一個是來自C語言的char*指針類型,一個是C++的STL中的string類型。
5、指針類型
指針類型可以在任何非指針類型的基礎上,得到對應類型的指針類型,其實指針就是一個內存的地址,表示一個內存地址單元的數字。
6、數組類型
對任何一種類型,都對應着該類型的數組類型,在函數的返回值是數組的時候,記得要返回數組的指針,也就是數組中第一個元素的內存地址。
7、引用類型
引用類型是C++中特有的一種數據類型,它可以是某個對象的別名,通過這個別名就能夠引用到對象,從而間接地操作這個對象。
在定義引用類型的時候,必須知道所要引用的對象的類型和該對象確實真實地存在,這樣我們才能夠去引用它從而操作它。
引用類型,可以是任意類型加上取地址符號&,就構成了引用類型。
8、類類型
類類型一般包括類的聲明和類的定義。類的聲明,是指告訴編譯器,某個類型已經存在;而類的定義,就是一個類在運行時應該表現出來的行爲。C++提供的標準類庫STL,提供了大量有用的類供我們使用。在實際開發中,我們還可以根據實際情況,定義我們自己需要的類類型。
下面,通過編寫一個例子,對上面C++的類型有個基本的瞭解。代碼如下所示:
#include <iostream>
#include <string>
using namespace std;
class person;
void test_bool();
void test_enum();
void test_reference();
void test_pointer();
void test_class();
int main() {
test_bool();
cout<<endl;
test_enum();
cout<<endl;
test_reference();
cout<<endl;
test_pointer();
cout<<endl;
test_class();
return 0;
}
void test_bool() {
bool is_good = true;
cout<<"is_good="<<is_good<<endl;
}
enum week {
SUN=100, MON, TUS, WED, THU, FRI, STA
};
void test_enum() {
week week_day = STA;
cout<<"week_day="<<week_day<<endl;
}
void test_reference() {
float price = 12.56;
float& ref_price = price;
cout<<"Before modifying reference:"<<endl;
cout<<"price="<<price<<endl;
cout<<"ref_price="<<ref_price<<endl;
ref_price += 78.35;
cout<<"After modifying reference:"<<endl;
cout<<"price="<<price<<endl;
cout<<"ref_price="<<ref_price<<endl;
}
void test_pointer() {
int *ptr = NULL;
int counter = 100;
ptr = &counter;
cout<<"Before *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl;
*ptr++;
cout<<"After *ptr++, counter="<<counter<<", *ptr="<<*ptr<<endl;
ptr = &counter;
cout<<"Before (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl;
(*ptr)++;
cout<<"After (*ptr)++, counter="<<counter<<", *ptr="<<*ptr<<endl;
}
class person {
public:
person(string& name, int age):name(name), age(age) {
}
string& get_name() {
return name;
}
int get_age() {
return age;
}
private:
string &name;
int age;
};
void test_class() {
string name("James Halt");
int age = 24;
person *james = new person(name, age);
cout<<"person->name="<<james->get_name()<<endl;
cout<<"person->age="<<james->get_age()<<endl;
delete james;
}
編譯運行:
[hadoop@localhost c++]$ g++ -Wall -o mynote01 mynote01.cpp
[hadoop@localhost c++]$ ./mynote01
運行結果,輸出如下所示:
is_good=1
week_day=106
Before modifying reference:
price=12.56
ref_price=12.56
After modifying reference:
price=90.91
ref_price=90.91
Before *ptr++, counter=100, *ptr=100
After *ptr++, counter=100, *ptr=-1076961796
Before (*ptr)++, counter=100, *ptr=100
After (*ptr)++, counter=101, *ptr=101
person->name=James Halt
person->age=24
通過上面程序運行結果,可以看到:
(1)布爾類型中,true實際等於1,false等於0;
(2)枚舉類型,可以指定初始值,然後每個枚舉成員依次遞增1;
(3)引用類型,可以通過引用來修改引用類型變量所引用的變量值;
(4)通過指針可以修改指針指向的變量的值。
第二部分:C++保留關鍵字
C++保留的關鍵字,如下所示:
asm |
auto |
bad_cast |
bad_typeid |
bool |
break |
case |
catch |
char |
class |
const |
const_cast |
continue |
default |
delete |
do |
double |
dynamic_cast |
else |
enum |
except |
explicit |
extern |
false |
finally |
float |
for |
friend |
goto |
if |
inline |
int |
long |
mutable |
namespace |
new |
operator |
private |
protected |
public |
register |
reinterpret_cast |
return |
short |
signed |
sizeof |
static |
static_cast |
struct |
switch |
template |
this |
throw |
true |
try |
type_info |
typedef |
typeid |
typename |
union |
unsigned |
using |
virtual |
void |
volatile |
while |
簡單介紹幾個:
1、const修飾符
const是常量修飾符,可以修飾任何基本類型,表示該類型的常量,在計算過程中常量的值是不可以改變的。
2、volatile修飾符
volatile修飾符也可以修飾任何基本類型,通常是爲了告訴所使用的編譯器,可能在編譯器控制或者監測環境之外發生改變。
3、typedef關鍵字
用於重新定義一個類型的,通常將已經存在的類型重新定義爲具有含義的類型標識符。
4、template關鍵字
C++定義模板的時候,使用template關鍵來定義。
5、using與namespace關鍵字
定義或者聲明命名空間的時候使用using namespace關鍵字。
6、inline關鍵字
在生命內聯函數的時候使用inline關鍵字。inline 內聯函數給出了一種解決方案:若一個函數被指定爲inline 函數則它將在程序中每個調用點上被內聯地展開。inline 機制用來優化小的只有幾行的經常被調用的函數。
7、new與delete關鍵字
在堆上創建對象,也就是與整個應用程序的聲明週期相同,除非顯式地使用delete關鍵字釋放堆上分配的內存,而且必須顯式地使用delete來回收,否則會造成內存泄露。
8、operator關鍵字
操作符重載,使用operator關鍵字來重載定義。
9、typename關鍵字
typename是用來定義泛型,聲明模板的類型的。
我們直接來看這些保留關鍵字,可能感覺非常枯燥,而且幾乎不可能真正理解它們到底是做什麼用的。那麼,只有通過多多實踐,來逐漸地瞭解並熟悉C++語言的特性,這應該是一種鞏固C++編程基礎的合理途徑。
第三部分:編譯運行C++程序
在Linux系統下,知道如何編譯和運行C++程序,這是最基礎的。在Linux下使用vim編輯器,例如,要在mycpp01.cpp文件中輸入C++源代碼,可以直接使用vim編輯器:
vi mynote01.cpp
然後,編寫C++程序。編寫完成後,保存源文件,然後進行編譯:
g++ -Wall -o mynote01 mynote01.cpp
這時,如果存在警告或者錯誤信息,就會打印出來,便於定位問題並進行修正。如果程序沒有問題,則會生成可執行文件mynote01,能夠運行你編寫的程序。運行C++程序,執行如下命令:
./mynote01
這樣,就能夠按照我們編寫的C++程序的邏輯去執行。