C++ Primer 5th 01
- Stanley B. Lippman / Josee Lajoie / Barbara E. Moo 著
- 王剛/楊巨峰 譯
- 電子工業(yè)出版社
第一章 開始
本章介紹C++的大部分基礎內容:類型恳啥、變量滓鸠、表達式步藕、語句及函數(shù)蚁鳖。
1.1 編寫一個簡單的C++程序
- 每個C++程序都包含一個或多個函數(shù)(function)展懈,其中一個必須命名為main。
- 一個函數(shù)的定義包含四個部分:返回類型(return type)囚枪、函數(shù)名(function name)缸榛、形參列表(parameter list)、函數(shù)體(function body)凉翻。
- main函數(shù)的返回類型必須為int了讨,即整數(shù)類型。
- 函數(shù)定義的最后一部分是函數(shù)體,它是一個以左花括號(curly brace)開始前计,以右花括號結束的語句塊(block of statements)胞谭。
1.1.1 編譯、運行程序
- 程序源文件命名約定
- 從命令行運行編譯器
1.2 初識輸入輸出
標準輸入輸出對象
- standard input -> cin
- standard output -> cout
- standard error -> cerr
- 輸出程序運行時的一般性信息 -> clog
一個使用IO庫的程序
#include <iostream>
int main ()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
向流寫入數(shù)據(jù)
- 在C++中男杈,一個表達式產生一個計算結果丈屹,它由一個或多個運算對象和(通常是)一個運算符組成。
- <<運算符接受兩個運算對象:左側的運算對象必須是一個ostream對象伶棒,右側的運算對象是要打印的值旺垒。此運算都將給定的值寫到給定的ostream對象中。輸出運算符的計算結果就是其左側運算對象肤无。即先蒋,計算結果就是我們寫入給定值的那個ostream對象。
std::cout << "Enter two numbers : " << std::endl
//上個式子等價于
(std::cout << "Enter two numbers : ") << std::endl;
//兩條語句生成相同的輸出
std::cout << "Enter two numbers: ";
std::cout << std::endl;
- endl是一個操縱符(manipulator)宛渐,效果是結束當前行竞漾,并將與設備關聯(lián)的緩沖區(qū)(buffer)中的內容刷新到設備中。緩沖刷新操作可以保證到目前為止程序所產生的所有輸出都真正寫入輸出流中窥翩,而不是僅停留在內存中等待寫入流业岁。在調試時添加的打印語句應該保證“一直”刷新流质涛。否則如果程序崩潰,輸出可能還留在緩沖區(qū)中帮碰,從而導致程序崩潰位置的錯誤推斷宋列。
使用標準庫中的名字
前綴std::指出名字cout和endl是定義在名為std的命名空間(namespace)中的。命名空間可以幫助我們避免不經(jīng)意的名字定義沖突但荤,以及使用庫中相同名字導致的沖突。標準庫定義的所有名字都在命名空間std中。
從流讀取數(shù)據(jù)
輸入運算符>>與輸出運算符類似爹梁,它接受一個istream作為其左側運算對象,接受一個對象作為其右側運算對象提澎。它從給定的istream讀入數(shù)據(jù)姚垃,并存如給定對象中。與輸入運算符類似盼忌,輸入運算符返回其左側運算對象作為其計算結果积糯。
std::cin >> v1 >> v2;
//上個式子等價于
(std::cin >> v1) >> v2;
//兩條語句生成相同的輸出
std::cin >> v1;
std::cin >> v2;
1.3 注釋簡介
C++中注釋的種類
C++中有兩種注釋:單行注釋和界定符對注釋。單行注釋以雙斜線(//)開始谦纱,以換行符結束看成。另一種注釋使用繼承自C語言的兩個界定符(/和/)。我們所采取的風格是跨嘉,注釋內的每行都以一個星號開頭川慌,從而指出整個范圍都是多行注釋的一部分。
注釋界定符不能嵌套
- 界定符對形式的注釋是以/開始,以/結束的梦重。因此兑燥,一個注釋不能嵌套在另一個注釋之內。編譯器對這類問題所給出的錯誤可能是難以理解的琴拧、令人迷惑的降瞳。
- 我們通常需要在調試期間注釋掉一些代碼。由于這些代碼可能包含界定符對形式的注釋蚓胸,因此可能導致注釋嵌套錯誤挣饥,因此最好的方式是用單行注釋方式注釋掉代碼段的每一行。
1.4 控制流
1.4.1 while語句
while語句反復執(zhí)行一段代碼赢织,直至給定條件為假為止亮靴。
//while語句的形式為
while (condition)
statement
- while語句的執(zhí)行過程是交替地檢測condition條件和執(zhí)行關聯(lián)的語句statement,直至condition為假時停止于置。
- 所謂條件(condition)就是一個產生真或假的結果的表達式茧吊。只要condition為真,statement就會被執(zhí)行八毯。當執(zhí)行完statement搓侄,會再次檢測condition。如果condition仍為真话速,statement再次被執(zhí)行讶踪。while語句持續(xù)地交替檢測condition和執(zhí)行statement,直至condition為假為止泊交。
- 所謂語句塊(block)乳讥,就是用花括號包圍的零條或多條語句的序列。語句塊也是語句的一種廓俭,在任何要求使用語句的地方都可以使用語句塊云石。
1.4.2 for語句
while (val <= 10) {
sum += val;
++val;
}
- 這種在循環(huán)條件中檢測變量、在循環(huán)體中遞增變量的模式使用非常頻繁研乒,以至于C++語言專門定義了第二種循環(huán)語句 -- for語句汹忠,來簡化符合這種模式的語句。
int sum = 0;
for (int val = 1; val <= 10; ++val)
sum += val;
- 每個for語句都包含兩部分:循環(huán)頭和循環(huán)體雹熬。循環(huán)頭控制循環(huán)體的執(zhí)行次數(shù)宽菜,它由三部分組成:一個初始化語句(init-statement)、一個循環(huán)條件(condition)以及一個表達式(expression)竿报。
1.4.3 讀取數(shù)量不定的輸入數(shù)據(jù)
# include <iostream>
int main()
{
int sum = 0, value = 0;
//讀取數(shù)據(jù)直到遇到文件尾铅乡,計算所有讀入的值的和
while (std::cin >> value)
sum += value;
std::cout << "Sum is: " << sum << std::endl;
return 0;
}
- 當我們使用一個istream對象作為條件時,其效果是檢測流的狀態(tài)仰楚。如果流是有效的隆判,即流未遇到錯誤犬庇,那么檢測成功。當遇到文件結束符(end-of-file)侨嘀,或遇到一個無效輸入時(例如讀入的值不是一個整數(shù))臭挽,istream對象的狀態(tài)會變?yōu)闊o效。處于無效狀態(tài)的istream對象會使條件變?yōu)榧佟?/li>
1.4.4 if語句
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal)
{
int cnt = 1;
while (std::cin >> val)
{
if (val == currVal)
{
++cnt;
}
else
{
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
}
return 0;
}
從鍵盤輸入文件結束符
當從鍵盤向程序輸入數(shù)據(jù)時咬腕,對于如何指出文件結束欢峰,不同操作系統(tǒng)有不同的約定。在Windows系統(tǒng)中涨共,輸入文件結束符的方法是敲Ctrl+Z纽帖,然后按Enter或Return鍵。在UNIX系統(tǒng)中举反,包括Mac OS X 系統(tǒng)中懊直,文件結束符輸入使用Ctrl+D。
1.5 類簡介
- 在C++中火鼻,我們通過定義一個類(Class)來定義自己的數(shù)據(jù)結構室囊。一個類定義了一個類型,以及與其關聯(lián)的一組操作魁索。類機制是C++最重要的特性之一融撞。實際上,C++設計最初的一個設計焦點就是能定義使用上像內置類型一樣自然的類類型(class type)粗蔚。
1.5.1 Sales_item類
- 每個類實際上都定義了一個新的類型尝偎,其類型名就是類名。
- 為了使用一個類鹏控,我們不必關心它是如何實現(xiàn)的致扯,只需知道類對象可以執(zhí)行什么操作。
- 一般而言当辐,類的作者決定了類類型對象上可以使用的所有操作急前。
- 包含來自標準庫的頭文件時,也應該用尖括號(< >)包圍頭文件名瀑构。對于不屬于標準庫的頭文件,則用雙引號(" ")包圍刨摩。
使用文件重定向
$ addItems <infile>outfile
- 文件重定向機制允許我們將標準輸入與標準輸出與命名文件關聯(lián)起來寺晌。假定$時操作系統(tǒng)提示符,我們的加法程序已經(jīng)編譯為名為addItems.exe的可執(zhí)行文件澡刹,則上述命令會從一個名為infile的文件讀取銷售記錄呻征,并將輸出結果寫入到一個名為outfile的文件中,兩個文件都位于當前目錄中罢浇。
1.5.2 初識成員函數(shù)
- 成員函數(shù)定義為類的一部分的函數(shù)陆赋,有時也被稱為方法(method)沐祷。
- 我們通常以一個類對象的名義來調用成員函數(shù)。
item1.isbn() == item2.isbn()
- 使用點運算符(.)來表達我們需要“名為item1的對象的isbn成員”攒岛。點運算符只能用與類類型的對象赖临。其左側運算對象必須是一個類類型的對象,右側運算對象必須是該類型的一個成員名灾锯,運算結果為右側對象指定的成員兢榨。
- 當用點運算訪問一個成員函數(shù)時,通常我們是想(效果也確實是)調用該函數(shù)顺饮。我們使用調用運算符( () )來調用一個函數(shù)吵聪。調用運算符是一對圓括號,里面放置實參(argument)列表(可能為空)兼雄。
1.6 書店程序
//