C++Primer 5th 01

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 初識輸入輸出

標準輸入輸出對象

  1. standard input -> cin
  2. standard output -> cout
  3. standard error -> cerr
  4. 輸出程序運行時的一般性信息 -> 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 書店程序

//
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吟逝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赦肋,更是在濱河造成了極大的恐慌块攒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件金砍,死亡現(xiàn)場離奇詭異局蚀,居然都是意外死亡,警方通過查閱死者的電腦和手機恕稠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門琅绅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹅巍,你說我怎么就攤上這事千扶。” “怎么了骆捧?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵澎羞,是天一觀的道長。 經(jīng)常有香客問我敛苇,道長妆绞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任枫攀,我火速辦了婚禮括饶,結果婚禮上,老公的妹妹穿的比我還像新娘来涨。我一直安慰自己图焰,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布蹦掐。 她就那樣靜靜地躺著技羔,像睡著了一般僵闯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藤滥,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天鳖粟,我揣著相機與錄音,去河邊找鬼超陆。 笑死牺弹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的时呀。 我是一名探鬼主播张漂,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谨娜!你這毒婦竟也來了航攒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤趴梢,失蹤者是張志新(化名)和其女友劉穎漠畜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坞靶,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡憔狞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彰阴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾敢。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尿这,靈堂內的尸體忽然破棺而出簇抵,到底是詐尸還是另有隱情,我是刑警寧澤射众,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布碟摆,位于F島的核電站,受9級特大地震影響叨橱,放射性物質發(fā)生泄漏典蜕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一罗洗、第九天 我趴在偏房一處隱蔽的房頂上張望嘉裤。 院中可真熱鬧,春花似錦栖博、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽典奉。三九已至,卻和暖如春丧叽,著一層夾襖步出監(jiān)牢的瞬間卫玖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工踊淳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留假瞬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓迂尝,卻偏偏與公主長得像脱茉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垄开,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容