筆記:《C++ Primer 中文版(第5版)》 第1章 開始

m0_51323818發表於2020-10-05

1.1 編寫一個簡單的C++程式

  1. 每個C++程式都包含一個或多個函式,其中一個必須命名為main。作業系統通過呼叫main來執行C++程式。
  2. 一個函式的定義包含四部分:返回型別、函式名、一個括號包圍的形參列表以及函式體。
  3. main函式的返回型別必須為int,即整數型別。int型別是一種內建型別,即語言自身定義的型別。
  4. 函式體是一個以左花括號開始,以右花括號結束的語句塊。
  5. return語句結束函式的執行,通常還會向呼叫者返回一個值。當return語句包括一個值時,此返回值的型別必須與函式的返回型別相同。在大多數系統中,main的返回值被用來指示狀態,返回值0表示成功,非0的返回值的含義由系統定義,通常用來指出錯誤型別。
  6. 在C++中,大多數C++語句以分號表示結束。
  7. 型別是程式設計最基本的概念之一。一種型別不僅定義了資料元素的內容,還定義了這類資料上可以進行的運算。程式所處理的資料都儲存在變數中,而每個變數都有自己的型別。

1.1.1 編譯、執行程式

  1. 整合開發環境(IDE)將編譯器與其他程式建立和分析工具包裝在一起。在開發大型程式時,這類整合環境可能是非常有用的工具。
  2. 程式檔案通常被稱為原始檔。不同編譯器使用不同的字尾命名約定,最常見的包括.cc、.cxx、.cpp、.cp及.C。

1.2 初識輸入輸出

  1. C++語言並未定義任何輸入輸出(IO)語句,取而代之,包含了一個全面的標準庫來提供IO機制(以及很多其他設施)。
  2. iostream庫包含兩個基礎型別istreamostream,分別表示輸入流和輸出流。一個流就是一個字元序列,是從IO裝置讀出或寫入IO裝置的。術語“流”想要表達的是,隨著時間的推移,字元是順序生成或消耗的。
  3. 標準庫定義了4個IO物件。為了處理輸入,我們使用一個名為cin(發音為see-in)的istream型別的物件。這個物件也被稱為標準輸入。對於輸出,我們使用一個名為cout(發音為see-out)的ostream型別的物件。此物件也被稱為標準輸出。標準庫還定義了其他兩個ostream物件,名為cerrclog(發音分別為see-err和see-log)。我們通常用cerr來輸出警告和錯誤訊息,因此它也被稱為標準錯誤。而clog用來輸出程式執行時的一般性資訊。
  4. 系統通常將程式所執行的視窗與這些物件關聯起來。因此,當我們讀取cin,資料將從程式正在執行的視窗讀入,當我們向cout、cerr和clog寫入資料時,將會寫到同一個視窗。
  5. 每個使用標準庫設施的程式都必須包含相關的標頭檔案。#include指令用於包含標頭檔案,其後尖括號中的名字則指出要包含的標頭檔案是哪一個。#include指令和標頭檔案的名字必須寫在同一行中。通常情況下,#include指令必須出現在所有函式之外。我們一般將一個程式的所有#include指令都放在原始檔的開始位置。
  6. 在C++中,一個表示式產生一個計算結果,它由一個或多個運算物件和(通常是)一個運算子組成。
  7. 輸出運算子(<<)接受兩個運算物件:左側的運算物件必須是一個ostream物件,右側的運算物件是要列印的值。此運算子將給定的值寫到給定的ostream物件中。輸出運算子的計算結果就是其左側運算物件,所以可以在一條輸出語句中使用多個輸出運算子,將多個輸出請求連線起來。
  8. 字串字面值常量是用一對雙引號包圍的字元序列。
  9. endl是一個被稱為操縱符的特殊值。向輸出流寫入endl的效果是結束當前行,並將與裝置關聯的緩衝區中的內容刷到裝置中。緩衝重新整理操作可以保證到目前為止程式所產生的所有輸出都真正寫入輸出流中,而不是僅停留在記憶體中等待寫入流。程式設計師常常在除錯時新增列印語句,這類語句應該保證“一直”重新整理流。否則,如果程式崩潰,輸出可能還留在緩衝區中,從而導致關於程式崩潰位置的錯誤推斷。
  10. 名稱空間可以幫助我們避免不經意間的名字定義衝突,以及使用庫中相同名字導致的衝突。標準庫定義的所有名字都在名稱空間std中。
  11. 通過名稱空間使用標準庫有一個副作用:當使用標準庫中的一個名字時,必須顯示說明我們想使用來自名稱空間std中的名字,如std::cout等。其中,作用域運算子(::)指出我們使用的名字位於哪一個名稱空間。
  12. 初始化一個變數,就是在變數建立的同時為它賦予一個值。
  13. 輸入運算子(>>)接受一個istream物件作為其左側運算物件,接受一個物件作為其右側運算物件。它從給定的istream物件讀入資料,並存入給定物件中。輸入運算子返回其左側運算物件作為其計算結果,所以可以在一條輸入語句中使用多個輸入運算子,將多個輸入請求連線起來。

1.3 註釋簡介

  1. 註釋可以幫助人類讀者理解程式。註釋通常用於概述演算法,確定變數的用途,或者解釋晦澀難懂的程式碼段。編譯器會忽略註釋,因此註釋對程式的行為或效能不會有任何影響。由於程式設計師傾向於相信註釋的內容是正確可信的,因此,錯誤的註釋比完全沒有註釋更糟糕,因為它會誤導讀者。所以,記住在修改程式碼後及時更新註釋。
  2. 單行註釋以雙斜線(//)開始,以換行符結束。當前行雙斜線右側的所有內容都會被編譯器忽略,這種註釋可以包含任何文字,包括額外的雙斜線。
  3. 界定符對註釋以/*開始,以*/結束,可以包含除*/外的任意內容(因而不能巢狀),包括換行符。編譯器將落在/*和*/之間的所有內容都當作註釋。註釋界定符可以放置於任何允許放置製表符、空格符或換行符的地方。界定符對註釋可以跨越程式中的多行,若如此做,最好能顯式指出其內部的程式行都屬於多行註釋的一部分,如在註釋內的每行開頭都加上一個星號等。

1.4 控制流

1.4.1 while語句

  1. while語句反覆執行一段程式碼,直至給定條件為假為止。其形式為:while (condition) statement。while語句的執行過程是交替地檢測condition條件和執行關聯的語句statement,直至condition為假時停止。
  2. 所謂條件就是一個產生真或假的結果的表示式。
  3. 在while語句中,迴圈體statement可以是語句塊。所謂語句塊,就是用花括號包圍的零條或多條語句的序列。語句塊也是語句的一種,在任何要求使用語句的地方都可以使用語句塊。
  4. +=是一種複合賦值運算子,作用是將其右側的運算物件加到左側運算物件上,將結果儲存到左側運算物件中。它本質上與一個加法結合一個賦值是相同的。
  5. 遞增運算子(++)的作用是將運算物件的值增加1。與之對應,遞減運算子(--)的作用是將運算物件的值減少1。遞增運算子與遞減運算子都有字首式和字尾式兩種。

1.4.2 for語句

  1. 每個for語句都包含兩部分:迴圈頭和迴圈體。迴圈頭控制迴圈體的執行次數,它由三部分組成:一個初始化語句、一個迴圈條件以及一個表示式。
  2. 初始化語句用於為控制迴圈的變數賦初值。如果控制迴圈的變數是由初始化語句定義的,那麼這個變數只能在for迴圈內部使用,在迴圈結束後是不能使用的。初始化語句只在for迴圈入口處執行一次。
  3. 迴圈體每次執行前都會檢查迴圈條件,只要條件為真,就會反覆執行迴圈體並計算表示式的結果(通常是用遞增或遞減運算子修改控制迴圈的變數)。

1.4.3 讀取數量不定的輸入資料

  1. 實現不斷讀取資料直至沒有新的輸入的一種方法是:while (std::cin >> value)
  2. 當我們使用一個istream物件作為條件時,其效果是檢測流的狀態。如果流是有效的,即流未遇到錯誤,那麼檢測成功。當遇到檔案結束符,或遇到一個無效輸入時,istream物件的狀態會變為無效。處於無效狀態的istream物件會使條件變為假。
  3. 在不同的作業系統中,如何指出檔案結束有不同的約定。在Windows系統中輸入檔案結束符的方法是敲Ctrl+Z,而在UNIX和Mac OS X系統中輸入檔案結束符的方法是敲Ctrl+D。
  4. 編譯器無法檢查一個程式是否按照其作者的意圖工作,但是可以檢查形式上的錯誤,如語法錯誤型別錯誤宣告錯誤。宣告錯誤的通常情況是:對來自標準庫的名字忘記使用std::、識別符號名字拼寫錯誤等。
  5. 錯誤資訊通常包含一個行號和一條簡短描述,描述了編譯器認為的我們所犯的錯誤。因為一個錯誤常常會具有傳遞效應,導致編譯器在其後報告比實際數量多得多的錯誤資訊,所以建議按照報告的順序來逐個修正錯誤,並在每修正一個錯誤或一小部分明顯的錯誤後就立即重新編譯程式碼。這就是所謂的“編輯-編譯-除錯”週期。

1.4.4 if語句

  1. if語句的形式是:if (condition) statement else statement。當condition條件為真時執行緊跟著的statement,否則執行if語句後面的語句,或是執行緊跟著對應else語句的statement(如果有的話)。
  2. C++用=進行賦值,用==作為相等運算子。兩個運算子都可以出現在條件中。一個常見的錯誤是想在條件中使用==(相等判斷),卻誤用了=。
  3. C++程式很大程度上是格式自由的,即何處放置花括號、縮排、註釋以及換行符通常不會影響程式的語義。但我們所做的選擇會影響程式的可讀性。當我們要選擇一種格式風格時,思考一下它會對程式的可讀性和易理解性有什麼影響,而一旦選擇了一種風格,就要堅持使用。

1.5 類簡介

  1. 類機制是C++最重要的特性之一。一個定義了一個型別,以及與其關聯的一組操作。
  2. 習慣上,標頭檔案根據其中定義的類的名字來命名。我們通常使用.h作為標頭檔案的字尾,但也有一些程式設計師習慣.H、.hpp或.hxx。標準庫標頭檔案通常不帶字尾。

1.5.1 Sales_item類

  1. 每個類實際上都定義了一個新的型別,其型別名就是類名。與內建型別一樣,我們可以定義類型別的變數。
  2. 一般而言,類的作者決定了類型別物件上可以使用的所有操作。
  3. 包含來自標準庫的標頭檔案時,使用尖括號(<>)包圍標頭檔案名,而對於不屬於標準庫的標頭檔案,則用雙引號("")包圍。
  4. 大多數作業系統支援檔案重定向,這種機制允許我們將標準輸入和標準輸出與命名檔案關聯起來:$ addItems <infile >outfile。假定$是作業系統提示符,addItem為某一可執行檔案,則上述命令會從一個名為infile的檔案讀取輸入,並將輸出結果寫入到一個名為outfile的檔案中,兩個檔案都位於當前目錄中。

1.5.2 初識成員函式

  1. 成員函式是定義為類的一部分的函式,有時也被稱為方法
  2. 我們使用點運算子(.)來訪問成員函式。點運算子的左側運算物件必須是一個類型別的物件,右側運算物件必須是該型別的一個成員名,運算結果為右側運算物件指定的成員。
  3. 我們使用呼叫運算子(())來呼叫一個函式。呼叫運算子是一對圓括號,裡面放置實參列表(可能為空)。

1.6 書店程式

(無)

相關文章