前言
懂C的人說(shuō)這些太簡(jiǎn)單我不會(huì)C++,沒問題费奸,跟凱哥一起學(xué)(三)弥激,但是有些東西是其他人必須過一眼的,這樣才可以知道怎么讀代碼愿阐,怎么check question , 怎么去google.好了接下來(lái)我們順著擼微服,過于基礎(chǔ)的會(huì)直接略過。
操作符
- 數(shù)學(xué)運(yùn)算操作符 (+缨历、-以蕴、*、/辛孵、%丛肮、++、--)
- 關(guān)系運(yùn)算操作符 (==魄缚、!=宝与、>、>冶匹、>=伴鳖、<=)
- 邏輯運(yùn)算操作符 (&&、||徙硅、!)
- 位運(yùn)算操作符 (與、或搞疗、非和異或的真值表)
- 賦值運(yùn)算操作符
- 復(fù)合運(yùn)算操作符
位運(yùn)算操作符
以上6點(diǎn)大部分比較簡(jiǎn)單和java差不多嗓蘑,這里不再累贅:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
`A^B` = 0011 0001
~A = 1100 0011
復(fù)合運(yùn)算符
循環(huán)的類型
無(wú)窮循環(huán)
如果循環(huán)條件無(wú)法變?yōu)?false 的話,那么該訓(xùn)話那就是無(wú)窮循環(huán)匿乃。for 循環(huán)就是實(shí)現(xiàn)無(wú)窮循環(huán)桩皿。for 循環(huán)條件中 的三個(gè)表達(dá)式并不是必須的,所以只要將條件判斷語(yǔ)句置空就可以實(shí)現(xiàn)無(wú)窮循環(huán)幢炸。當(dāng)條件判斷語(yǔ)句置空后泄隔,就默認(rèn)是 true. 程序員也可以保留初始化和遞增表達(dá)式,但是 C++ 工程師一般都是使 用 for(;;)來(lái)表達(dá)無(wú)窮循環(huán)宛徊。
#include <iostream>
using namespace std;
int main () {
for( ; ; )
{
printf("This loop will run forever.\n");
}
return 0; }
注意:可以通過 Ctrl + C 的方式來(lái)終止無(wú)窮循環(huán)佛嬉。
定義一個(gè)函數(shù)
C++ 函數(shù)的定義的一般形式如下所示:
return_type function_name( parameter list )
{
body of the function
}
返回值類型: 一個(gè)函數(shù)可能返回一個(gè)值。 return-type 是該函數(shù)返回的值的數(shù)據(jù)類型闸天。有些函數(shù)執(zhí)行所需 的操作不返回一個(gè)值暖呕,在這種情況下,return-type 是關(guān)鍵字 void.
? 函數(shù)名稱: 這是函數(shù)實(shí)際的名字苞氮。函數(shù)名稱和參數(shù)列表一起構(gòu)成了這個(gè)函數(shù)的簽名湾揽。
? 參數(shù): 一個(gè)參數(shù)就像一個(gè)占位符。當(dāng)調(diào)用參數(shù)時(shí),你將把值傳遞給該參數(shù)库物。這個(gè)值稱為實(shí)際參數(shù)或參數(shù)霸旗。參 數(shù)列表是指一個(gè)函數(shù)的類型,順序和參數(shù)的數(shù)目戚揭。參數(shù)是可選的诱告,那就是指,一個(gè)函數(shù)可能不包含參數(shù)毫目。
? 函數(shù)體: 函數(shù)體包含定義函數(shù)做什么的一系列語(yǔ)句蔬啡。
當(dāng)你在一個(gè)源文件中定義了一個(gè)函數(shù)并且在另一個(gè)文件中調(diào)用了該函數(shù)時(shí),函數(shù)的聲明是必需的镀虐。在這種情況下箱蟆,你應(yīng)該在調(diào)用該函數(shù)的文件的頂部聲明這個(gè)函數(shù)。
函數(shù)參數(shù)
如果一個(gè)函數(shù)要使用參數(shù)刮便,它必須聲明接受參數(shù)值的變量空猜。這些變量被稱為函數(shù)的形參。 像其他本地變量一樣恨旱,這些形參在函數(shù)中辈毯,在進(jìn)入函數(shù)時(shí)創(chuàng)建,在退出函數(shù)時(shí)銷毀搜贤。 當(dāng)調(diào)用函數(shù)時(shí)谆沃,這里有兩種方式可以將參數(shù)傳遞給函數(shù)
詳細(xì)的 C++ 數(shù)組
C++ 提供了以下兩種類型的字符串表示形式:
? C 樣式字符串
? 用標(biāo)準(zhǔn) C++ 介紹的標(biāo)準(zhǔn)字符串類型
C 樣式字符串
C 樣式字符串源于 C 語(yǔ)言,在 C++ 中仍然被支持仪芒。這個(gè)串實(shí)際是一個(gè)字符的一維數(shù)組唁影,這個(gè)數(shù)組以一個(gè)空字符 ‘\0’ 結(jié)束。因此以 null 結(jié)尾的字符串包含由字符組成的字符串掂名,此字符串后跟著一個(gè) null据沈。
接下來(lái)聲明和初始化創(chuàng)建一個(gè)字符串,這個(gè)字符串組成一個(gè)單詞 "hello"饺蔑。為了包含數(shù)組末尾的空字符锌介,包含該 字符串的字符數(shù)組的大小應(yīng)該比單詞 "hello" 中的字符的數(shù)目多一個(gè)。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
如果你遵循數(shù)組初始化的規(guī)則猾警,你可以像下面一樣書寫上面的語(yǔ)句:
char greeting[] = "Hello";
實(shí)際上孔祸,你不需要在字符串常量的末尾放置一個(gè)空字符。 C++ 編譯器在初始化數(shù)組時(shí)自動(dòng)在串的末尾放置一個(gè) '\0'肿嘲。讓我們嘗試打印上述字符串:
#include <iostream>
using namespace std;
int main () {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
return 0; }
當(dāng)上述代碼被編譯執(zhí)行時(shí)融击,它將產(chǎn)生如下結(jié)果:
Greeting message: Hello
指針
如你所知,每個(gè)變量有一個(gè)內(nèi)存位置雳窟,每個(gè)內(nèi)存位置都有它的地址定義尊浪,這個(gè)地址定義可以使用表示內(nèi)存中地址 的和運(yùn)算符 (&) 進(jìn)行訪問匣屡。下面我們將打印定義的變量的地址:
#include <iostream>
using namespace std;
int main () {
int var1;
char var2[10];
cout << "Address of var1 variable: ";
cout << &var1 << endl;
cout << "Address of var2 variable: ";
cout << &var2 << endl;
return 0; }
當(dāng)上述代碼被編譯執(zhí)行時(shí),它將產(chǎn)生如下結(jié)果:
Address of var1 variable: 0xbfebd5c0
Address of var2 variable: 0xbfebd5b6
指針是一個(gè)變量拇涤,它的值是另一個(gè)變量的地址捣作。像任何變量或常量一樣,你必須在使用它之前聲明一個(gè)指針鹅士。 指針變量聲明的一般形式為:
type *var-name;
在這里券躁,type 是指針的基類型;它必須是一個(gè)有效的 C++ 類型,var-name 是指針變量的名稱掉盅。用來(lái)聲明一個(gè)指 針的星號(hào)與你用于乘法的星號(hào)是一樣的也拜。然而,在這個(gè)語(yǔ)句中趾痘,這個(gè)星號(hào)用來(lái)指定一個(gè)變量作為一個(gè)指針慢哈。以下 是有效的指針聲明:
int*ip;// pointer to an integer
double *dp;// pointer to a double
float *fp;// pointer to a float
char *ch // pointer to character
所有指針的值的實(shí)際的數(shù)據(jù)類型,或者是整數(shù)永票,浮點(diǎn)數(shù)卵贱,字符或者是其他,同樣的一個(gè)長(zhǎng)十六進(jìn)制數(shù)表示一個(gè)內(nèi)
存地址侣集。不同的數(shù)據(jù)類型的指針之間的唯一區(qū)別在于指針指向的變量或常量的數(shù)據(jù)類型键俱。
在 C++ 中使用指針
這里有幾個(gè)我們將非常頻繁的使用指針的重要的操作。
(a) 我們定義一個(gè)指針變量;
(b) 將一個(gè)變量的地址分配給指針;
(c) 最后使用在指針變量中的地址來(lái)訪問這個(gè)值世分。
這是通過使用一元運(yùn)算符 * 完成的编振,返回位于通過運(yùn)算符指定地址的變量的值。以下示例使用這些操作:
#include <iostream>
using namespace std;
int main () {
int var = 20; // actual variable declaration.
int *ip;// pointer variable
ip = &var; // store address of var in pointer variable
cout << "Value of var variable: ";
cout << var << endl;
// print the address stored in ip pointer variable
cout << "Address stored in ip variable: ";
cout << ip << endl;
// access the value at the address available in pointer
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0; }
當(dāng)上述代碼被編譯執(zhí)行時(shí)臭埋,它將產(chǎn)生如下結(jié)果:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
引用
引用變量是一個(gè)別名党觅,即已經(jīng)存在的變量的另一個(gè)名稱(引用就是某一個(gè)變量的別名)。一旦用一個(gè)變量初始化
引用斋泄,變量名稱和引用名稱都可以用來(lái)指示變量。
C++ 引用 VS 指針
引用與指針非常容易混淆镐牺,但引用和指針有三個(gè)主要區(qū)別:
? 空引用不可能存在炫掐。你必須始終能夠假定一個(gè)引用被連接到一個(gè)合法的存儲(chǔ)塊。
? 一旦一個(gè)引用被初始化為一個(gè)對(duì)象睬涧,它就不能改變?nèi)ブ甘玖硪粋€(gè)對(duì)象募胃。指針可以隨時(shí)改變指向另一個(gè)不同的 對(duì)象。
? 引用必須在它被創(chuàng)建時(shí)就初始化畦浓。指針可以在任何時(shí)候初始化痹束。
在 c++ 中創(chuàng)建引用
考慮到一個(gè)變量名是一個(gè)附加到該變量在內(nèi)存中的位置的標(biāo)簽。你可以認(rèn)為一個(gè)引用是附加到該內(nèi)存位置的第二 個(gè)標(biāo)簽讶请。因此,您可以通過原始變量名或引用來(lái)訪問變量的內(nèi)容祷嘶。例如屎媳,我們假設(shè)有下面的例子:
int i = 17;
我們可以為 i 聲明引用變量,如下所示论巍。
int& r = i;
在這些聲明中將 & 理解為引用(reference)烛谊。因此,第一個(gè)聲明理解為 “ r 是一個(gè)整數(shù)引用嘉汰,初始化為 i ” 和第二聲明理解為 “ s 是一個(gè)雙引用丹禀,初始化為 d ”。下面的例子使用了 int 和 double 引用:
#include <iostream>
using namespace std;
int main () {
// declare simple variables
inti;
double d;
// declare reference variables
int&r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0; }
將上面的代碼放在一起編譯鞋怀、執(zhí)行双泪,執(zhí)行結(jié)果如下 :
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
引用通常用于函數(shù)參數(shù)列表和函數(shù)返回值。以下是與 c++ 引用有關(guān)的兩個(gè)重要的方面密似,一個(gè) c++ 程序員應(yīng)該明 確了解:
1焙矛、引用作為參數(shù),c++ 支持引用作為函數(shù)參數(shù)傳遞辛友,它比直接傳遞參數(shù)更安全薄扁。
2、引用作為返回值废累, 可以從一個(gè) c++ 函數(shù)返回引用邓梅,就像返回任何其他數(shù)據(jù)類型。
I/O 庫(kù)頭文件
頭文件:#include<iostream>
這個(gè)頭文件定義了 cin邑滨、cout日缨、cerr 和 clog 對(duì)象,它們分別對(duì)應(yīng)于標(biāo)準(zhǔn)輸入流掖看,標(biāo)準(zhǔn)輸出流匣距,無(wú)緩 沖標(biāo)準(zhǔn)錯(cuò)誤流和有緩沖標(biāo)準(zhǔn)錯(cuò)誤流。
頭文件:#include<iomanip>
這個(gè)頭文件聲明了用于執(zhí)行格式化 I/O 操作的一系列服務(wù)哎壳,即所謂的參數(shù)化流操作毅待,如 setw 和 set precision。
頭文件:#include<fstream>
這個(gè)頭文件聲明了基于用戶控制的文件處理服務(wù)归榕。我們將在文件和流相關(guān)的章節(jié)更詳細(xì)討論關(guān)于它的 內(nèi)容尸红。
標(biāo)準(zhǔn)輸出流
預(yù)定義的對(duì)象 cout 是 ostream 類的一個(gè)實(shí)例。cout 對(duì)象通常連接到標(biāo)準(zhǔn)輸出設(shè)備刹泄,一般是顯示屏外里。cout 和流 插入運(yùn)算符聯(lián)合使用,流插入運(yùn)算符寫為 << 特石,即兩個(gè)表示小于的符號(hào)盅蝗,如以下示例所示。
#include <iostream>
using namespace std;
int main( ) {
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
編譯和執(zhí)行上面的代碼姆蘸,運(yùn)行結(jié)果如下:
Value of str is : Hello C++
C++ 編譯器也決定了輸出的變量數(shù)據(jù)類型并選擇適當(dāng)?shù)牧鞑迦脒\(yùn)算符來(lái)顯示值墩莫。 << 操作符重載了多種輸出數(shù)據(jù) 項(xiàng)(包括各種內(nèi)置類型:整數(shù)芙委、浮點(diǎn)數(shù)、雙精度浮點(diǎn)數(shù)贼穆、字符串和指針類型的值)题山。
插入運(yùn)算符 << 在一個(gè)語(yǔ)句中可能不止一次被使用,如上所示故痊,endl 寫在結(jié)束的時(shí)候用于添加一個(gè)新行
標(biāo)準(zhǔn)輸入流
預(yù)定義對(duì)象 cin 是 istream 類的一個(gè)實(shí)例顶瞳。cin 對(duì)象通常用于標(biāo)準(zhǔn)輸入設(shè)備,一般是鍵盤愕秫。cin 和流提取運(yùn)算 符聯(lián)合使用慨菱,流提取符號(hào)寫為 >> 即兩個(gè)表示大于的符號(hào),如以下示例所示戴甩。
#include <iostream>
using namespace std;
int main( ) {
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
編譯和執(zhí)行上面的代碼符喝,它會(huì)提示輸入一個(gè)名稱。輸入一個(gè)值甜孤,然后回車协饲,運(yùn)行結(jié)果如下:
Please enter your name: cplusplus
Your name is: cplusplus
C++ 編譯器也決定輸入值的數(shù)據(jù)類型和選擇適當(dāng)?shù)牧魈崛∵\(yùn)算符提取值并將其存儲(chǔ)在給定的變量。 流提取操作符 >> 可以在一個(gè)聲明中不止一次使用缴川。請(qǐng)求多個(gè)數(shù)據(jù)時(shí)茉稠,可采用以下書寫形式:
cin >> name >> age;
上述表達(dá)式等價(jià)于下面兩個(gè)聲明語(yǔ)句:
cin >> name;
cin >> age;
標(biāo)準(zhǔn)錯(cuò)誤流
預(yù)定義對(duì)象 cerr 是 ostream 類的一個(gè)實(shí)例。cerr 對(duì)象通常附加到標(biāo)準(zhǔn)錯(cuò)誤設(shè)備把夸,這一般也是一個(gè)顯示屏而线,但 對(duì)象 cerr 是無(wú)緩存的,每當(dāng)有流插入到 cerr 會(huì)導(dǎo)致其輸出立即出現(xiàn)恋日。
cerr 也與流插入操作符一起使用膀篮,如以下示例所示。
#include <iostream>
using namespace std;
int main( ) {
char str[] = "Unable to read....";
cerr << "Error message : " << str << endl;
}
編譯和執(zhí)行上面的代碼岂膳,運(yùn)行結(jié)果如下:
Error message : Unable to read....
標(biāo)準(zhǔn)日志流
預(yù)定義對(duì)象 clog 是 ostream 類的一個(gè)實(shí)例誓竿。clog 對(duì)象通常附加到標(biāo)準(zhǔn)錯(cuò)誤設(shè)備,這一般也是一個(gè)顯示屏谈截,但 對(duì)象 clog 是有緩沖的烤黍。這意味著每個(gè)插入的 clog 會(huì)暫存在緩沖區(qū)中,直到緩沖區(qū)滿或者緩沖區(qū)刷新才會(huì)產(chǎn)生 一次輸出傻盟。
clog 也與流插入操作符一起使用,如以下示例所示嫂丙。
#include <iostream>
using namespace std;
int main( ) {
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
編譯和執(zhí)行上面的代碼娘赴,運(yùn)行結(jié)果如下:
Error message : Unable to read....
在這些小例子中,你可能無(wú)法看出 cout,cerr,clog 的區(qū)別跟啤,但在編寫诽表、執(zhí)行大項(xiàng)目時(shí)唉锌,差異就變得顯而易見 了。所以這是很好的應(yīng)用實(shí)踐:使用 cerr 流顯示錯(cuò)誤消息竿奏,而使用 clog 顯示其他日志信息袄简。