1. 程式人生 > >C++ Primer 第五版 讀書筆記 第一章 開始

C++ Primer 第五版 讀書筆記 第一章 開始

下面是C++ Primer第一章的讀書筆記

————————————————————————

0001.作業系統如何執行C++程式
作業系統通過呼叫main來執行C++程式

0002.main
作業系統執行一個C++程式時所呼叫的函式
每個程式必須有且只有一個命名為main的函式

0003.函式
function
具名的計算單元

0004.C++函式的定義
C++函式的定義包含4部分:
返回型別:return type
函式名:function name
形參列表:parameter list,括號包圍,允許為空
函式體:function body

0005.語句
statement
程式的一部分,指定了當程式執行時進行什麼操作

0006.語句塊
block
零條或多條語句的序列
用花括號包圍

0007.花括號
curly brace
花括號用於劃定程式塊邊界
左花括號{為程式塊開始,右花括號}為結束

0008.函式名
function name
函式為人所知的名字
也用來進行函式呼叫

0009.形參列表
parameter list
函式定義的一部分
指出呼叫函式時可以使用什麼樣的實參
可能為空列表

0010.引數
實參,argument
向函式傳遞的值

0011.返回型別
return type
函式返回值的型別

0012.函式體
function body
一個以左花括號開始,以右花括號結束的語句塊
定義了函式所執行的動作

0013.main函式的返回型別
必須為int,即整數型別
int是c++內建型別(build-in type)

0014.類
class
一種用於定義自己的資料結構及其相關操作的機制
是C++中最基本的特性之一
標準庫型別中,istream/ostream都是類

0015.return語句
return語句結束函式的執行
還可以向呼叫者返回一個值
返回值的型別必須與函式的返回型別相容

0016.常見的c++程式原始檔字尾名
.cc .cxx .cpp .cp .C

0017.原始檔
source file
包含C++程式的檔案

0018.執行GNU編譯器的命令
g++ -o prog1 prog1.cpp
-o prog1 是編譯器引數,指定了可執行檔案的檔名

0019.c++語言的IO機制
C++語言並未定義任何輸入輸出語句
而是包含可一個全面的iostream庫來提供IO機制

0020.iostream庫包含的基礎型別
兩個基礎型別istream和ostream
分別表示輸出流和輸出流
一個流是一個字元序列
隨著時間的推移
字元是順序生成或消耗的

0021.庫型別
library type
標準庫定義的型別
如istream

0022.標準庫
standard library
一個型別和函式的集合,每個C++編譯器都必須支援

0023.iostream
標頭檔案
提供了面向流的輸入輸出的標準庫型別

0024.istream
提供了面向流的輸入的庫型別

0025.ostream
標準庫型別
提供面向流的輸出

0026.標準輸入輸出物件
標準庫定義了4個IO物件
cin:標準輸入
cout:標準輸出
cerr:標準錯誤
clog:輸出一般性資訊

0027.cin
一個istream物件
用來從標準輸入讀取資料

0028.cout
一個ostream物件,用於將資料寫入標準輸出
通常用於程式的正常輸出內容

0029.cerr
一個ostream物件
關聯到標準錯誤
通常用於輸出錯誤資訊或其他不屬於程式正常邏輯的輸出內容
預設不緩衝

0030.clog
一個ostream物件
關聯到標準錯誤
通常用於報告程式的執行資訊,存入一個日誌檔案中
預設是被緩衝的

0031.標準輸入
standard imput
輸入流
通常與程式執行所在視窗相關

0032.標準輸出
standard output
輸出流
通常與程式執行所在視窗相關聯

0033.標準錯誤
standard error
輸出流
用於報告錯誤
通常與程式執行所在視窗相關聯

0024.使用IO庫,提示使用者輸入兩個數,然後輸出它們的和
#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0 , v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "Then sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
    
    return 0;
}


0025.#include
標頭檔案包含指令
#include指令告訴編譯器想要使用的庫
使標頭檔案中程式碼可被程式使用

0026.標頭檔案
header
使類或其他名字的定義可被多個程式使用的一種機制
程式通過#include指令使用標頭檔案
每個使用標準庫的程式都必須包含相關的標頭檔案

0027.#include指令的用法
在尖括號中指出標頭檔案
#include指令和標頭檔案的名字必須寫在同一行
通常情況下,#include指令必須出現在所有函式之外
一般將一個程式的所有#include指令都放在原始檔的開始位置

0028.賦值
assignment
抹去一個物件的當前值
用一個新值取代之

0029.未初始化的變數
uninitialized variable
未賦予初值的變數
除非有顯式的初始化語句,定義在函式內部的內建型別變數預設是不初始化的
試圖使用一個未初始化變數的值是錯誤的
未初始化變數是bug的常見成因

0030.在標準輸出上列印訊息“Enter two numbers:”的語句
std::cout << "Enter two numbers:" << std::endl;

0031.<<運算子
<< operator
輸出運算子是將右側運算物件的值寫到左側運算物件表示的輸出流
<<運算子接受兩個運算物件:
左側的物件必須是一個ostream物件
右側的物件是要列印的值
輸出運算子可以連線
此時前方運算子的結果順序作為後方運算子的左側運算物件

0032.輸出運算子示例
cout<<"hi"
表示將hi寫到標準輸出。
cout<<"hi"<<"bye"
表示將輸出hibye

0033.字串常量
string literal
零或多個字元組成的序列,用雙引號包圍

0034..字串字面值常量
character string literal
string literal的另一種叫法
是用一對雙引號包圍的字元序列

0035.操縱符
manipulator
物件,如std::endl
在讀寫流的時候用來“操縱”流本身

0036.輸出運算子列印endl的效果
1.結束當前行
2.將與裝置關聯的緩衝區中的內容重新整理到裝置中

0037.緩衝區
buffer
一個儲存區域,用於儲存資料
IO裝置通常將輸入(或輸出)資料儲存在緩衝區中
讀寫緩衝區的動作與程式中的動作無關
預設情況下
讀cin或程式非正常終止時都會重新整理cout

0038.除錯程式時使用列印語句的注意事項
除錯程式時新增的列印語句應該一直使用endl操縱符重新整理流
否則如果程式崩潰
輸出可能還留在緩衝區
從而導致錯誤推斷程式崩潰位置

0039.名稱空間
namespace
將庫定義的名字放在一個單一位置的機制
可以幫助避免名字衝突
C++標準庫的名稱空間為std

0040.std
標準庫所使用的名稱空間

0041.::運算子
:: operator
作用域運算子
其用處之一是訪問名稱空間中的名字

0042.::運算子示例
std::cout表示使用定義在名稱空間std中的名字cout
使用作用域運算子指明使用定義在名稱空間std中的名字cout

0043.>>運算子
>> operator
輸入運算子
從左側運算物件所指定的輸入流讀取資料
存入右側運算物件中
輸入運算子可以連線

0044.輸入運算子示例
cin>>i
表示從標準輸入讀取下一個值存入i中
cin>>i>>j
表示先讀取一個值存入i
再讀取一個值存入j

0045.編寫程式,在標準輸出上列印Hello,world
#include<iostream>

int main(){
    std::cout<< "Hello, world"<<std::endl;
}

0046.編寫程式,使用乘法運算子*,來列印兩個數的積
#include<iostream>

int main(){
    int a,b;
    std::cin>>a>>b;
    std::cout<< a * b <<std::endl;
}

0047.註釋
comment
被編譯器忽略的程式文字

0048.c++的兩種註釋
以//開始的單行註釋,從//到行尾的內容都是註釋
以/*開始*/結尾的界定符對註釋,註釋界定符不能巢狀

0049.指出合法輸出語句,改編譯錯誤
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /*"*/" /*"/*"*/;
1/2/4合法,3去掉引號外的界定符

0050.while語句
while statement
迭代語句,提供重複執行直至一個特定條件為假的機制

0051.用while編寫一段程式,求1~10這10個數之和
#include<iostream>

int main()
{
    int sum = 0, val = 1;
    while (val <= 100) {
        sum += val;
        ++val;
    }
    std::cout<< "Sum of 1 to inclusive is "<< sum << std::endl;
    return 0;
}

0052.while語句的執行過程
交替地檢測condition(條件)和執行相關聯的statement(語句),
直至condition為假時停止

0053.條件
condition
求值結果為真或假的表示式
通常用值0表示假,用非零值表示真

0054.表示式
expression
最小的計算單元
一個表示式包含一個或多個運算物件
通常還包括一個或多個運算子
表示式求值會產生一個結果

0055.<=運算子
<= operator
小於等於運算子
檢測左側運算物件是否等於右側運算物件

0056.>=運算子
>=operator
大於等於運算子
檢測左側運算物件是否大於等於右側運算物件

0057.+=運算子
+= operator
複合賦值運算子
將右側運算物件加到左側運算物件上
a+=b 等價於 a=a+b

0058.++運算子
++ operator
遞增運算子
將運算物件的值加1
++i 等價於 i=i+1

0059.編寫程式,使用while將50到100的整數相加
#include<iostream>

int main() {
    int var = 50, sum = 0;
    while (var <= 100){
        sum += var;
        ++var;
    }
    std::cout << sum << std::endl;
}

0060.--運算子
-- operator
遞減運算子
將運算物件的值減1
--i等價於i=i-1

0061.編寫程式使用遞減運算子在迴圈中按遞減順序打印出10到0之間的整數
#include<iostream>

int main(){
    int var = 9;
    while (var > 0){
        std::cout << var << std::endl;
        --var;
    }
    return 0;
}

0062.>運算子
> operator
大於運算子
檢測左側運算物件是否大於右側運算物件

0063.<運算子
< operator
小於運算子
檢測左側運算物件是否小於右側運算物件

0064.編寫程式,提示使用者輸入兩個整數,打印出這兩個整數所指定範圍的所有整數
#include<iostream>

int main(){
    int var1,var2;
    std::cin >> var1 >> var2;
    while (var1 > var2+1){
        --var1;
        std::cout << var1 << std::endl;        
    }
    while (var2 > var1+1){
        --var2;
        std::cout << var2 << std::endl;        
    }
    return 0;
}

0065.for 語句
for statement
迭代語句
提供重複執行能力
通常用來將一個計算反覆執行指定次數

0066.用for語句來重寫從1加到10的程式
#include<iostream>

int main(){
    int sum = 0;
    for (int val = 1; val <= 10; ++val)
        sum += val;
    std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
    return 0;
}

0066.for語句包含的部分
每個for語句都包含兩部分
迴圈頭和迴圈體

0067.for語句迴圈頭的作用和組成
迴圈體控制迴圈體的執行次數
由三部分組成:
初始化語句:init-statement
迴圈條件:condition
表示式:expression

0068.初始化
initialize
在一個物件建立的時候賦予它一個值

0069.下面的for迴圈完成了什麼功能?sum的最終值是多少?
int sum = 0;
for (int i = -100; i <= 100; ++i)
    sum += i;

0070.對使用者輸入的一組數求和,不斷讀取資料直至沒有新的輸入為止
#include<iostream>

int main(){
    int sum = 0, value = 0;
    while (std::cin >> value)
        sum += value;
    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

0071.使用istream物件作為條件時的效果
當遇到檔案結束符或無效輸入時
istream物件的狀態會變為無效
處於無效狀態的istream物件會使條件變為假

0072.檔案結束符
end-of-line
系統特定的標識
指出檔案中無更多資料了

0073.從鍵盤輸入檔案結束符
windows系統中,輸入檔案結束符的方法是Ctrl+Z然後Enter
UNIX系統中是Ctrl+D

0074.常見的編譯器可以檢查出的錯誤
語法錯誤(syntax error)
型別錯誤(type error)
宣告錯誤(declaration error)

0075.常見的語法錯誤
漏掉函式的引數列表
語句結尾使用冒號而非引號
字串兩側漏掉引號
漏掉分號

0076.型別錯誤例子
向一個期望引數為int的函式傳遞了一個字串字面值常量

0077.常見宣告錯誤
對來自標準庫的名字忘記使用std::
識別符號名字拼寫錯誤

0078.編輯-編譯-除錯
edit-compile-debug
使程式能正確執行的開發過程
每修正一個錯誤就立即重新編譯程式碼
或者最多是修正了一小部分明顯的錯誤後就重新編譯

0079.if語句
if statement
根據一個特定條件的值進行條件執行的語句
如果條件為真,執行if語句體
否則執行else語句體(可選)

0080.使用if語句寫一個程式,來統計在輸入中每個值連續出現了多少次
測試資料:42 42 42 42 42 55 55 62 100 100 100
期待輸出:
    42 occurs 5 times
    55 occurs 2 times
    62 occurs 1 times
    100 occurs 3 times
    
#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;
}

0081.==運算子
== operator
相等運算子
檢測左側運算物件是否等於右側運算物件

0082.=運算子
= operator
將右側運算物件的值賦予左側運算物件所表示的物件

0083.條件中的常見錯誤
一個常見錯誤是想在條件中使用==(相等判斷),卻誤用了=

0084.C++程式的縮排和格式
C++程式在很大程度上是格式自由的
在哪裡放置花括號、縮排、註釋以及換行符通常不會影響程式的語義
不存在唯一正確的風格,但保持一致性是非常重要的

0085.資料結構
data structure
資料及其所允許操作的邏輯組合

0086.C++中如何定義資料結構
通過定義一個類(class)來定義資料結構
一個類定義了一個型別,以及與其相關聯的一組操作

0087.內建型別
built-in type
由語言定義的型別,如int

0088.類型別
class type
類定義的型別
類名即為型別名
一種型別不僅定義了資料元素的內容
還定義了這類資料上可以進行的運算

0089.標頭檔案的作用和命名
需要使用標頭檔案來訪問為自己的應用程式所定義的類
習慣上,標頭檔案根據其中定義的類的名字來命名
通常使用h作為標頭檔案的字尾

0090.使用類時需要了解的三件事
類名是什麼
在哪裡定義
支援什麼操作

0091.Sales_item類的作用
Sales_item類的作用是表示一本書的總銷售額、售出冊數和平均售價

0092.定義item為Sales_item類物件
Sales_item item;

0093.Sales_item類支援的操作
呼叫isbn函式從Sales_item物件中提取ISBN書號
用輸入運算子和輸出運算子讀寫Sales_item物件
用賦值運算子將一個Sales_item物件的值賦予另一個Sales_item物件
用加法運算子將兩個Sales_item物件相加。兩個物件的ISBN必須相同,加法結果是一個新的Sales_item物件,其ISBN與兩個運算物件相同,而總銷售額和售出冊數是兩者之和
使用複合賦值運算子將一個Sales_item物件加到另一個物件上

0094.編寫程式從標準輸入讀入資料,存入Sales_item物件,然後將Sales_item的內容寫回標準輸出
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item book;
    std::cin >> book;
    std::cout << book << std::endl;
    return 0;
}

0095.#include指令的兩種形式
包含來自標準庫的標頭檔案時,應該用尖括號包圍標頭檔案名
對於不屬於標準庫的標頭檔案,則用雙引號包圍

0096.輸入兩個Sales_item物件相加並列印它們的和
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 << std::endl;
    return 0;
}

0097.檔案重定向機制
大多數作業系統支援檔案重定向
這種機制將標準輸入與標準輸出與命名檔案關聯起來

0098.檔案重定向樣例
addItems <infile >outfile
addItems為可執行檔案
從名為infile的檔案讀取銷售記錄
將輸出結果寫入到名為outfile的檔案中
兩個檔案位於當前目錄

0099.寫出將兩個Sales_item物件相加的程式
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    if (item1.isbn() == item2.isbn()) {
        std::cout << item1 + item2 << std::endl;
        return 0;
    } else {
        std::cerr << "Data must refer to same ISBN" << std::endl;
        return -1;
    }
}

0100.成員函式
member function
類定義的操作
是定義為類的一部分的函式,有時也被稱為方法
通常通過呼叫成員函式來操作特定物件

0101.方法
method
成員函式的同義術語

0102..運算子
. operator
點運算子
左側運算物件必須是一個類型別物件
右側運算物件必須是此物件的一個成員的名字
運算結果即為該物件的這個成員

0103.()運算子
() operator
呼叫運算子
跟隨在函式名之後的一對括號,起到呼叫函式的效果
傳遞給函式的實參放置在括號內(可以為空)

0104.編寫程式從檔案中讀取銷售記錄,生成每本書的銷售報告,顯示售出冊數、總銷售額和平均售價(假定每個ISBN書號的所有銷售記錄在檔案中是聚在一起的)
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item total;
    if (std::cin >> total) {
        Sales_item trans;
        while (std::cin >> trans){
            if (total.isbn() == trans.isbn())
                total += trans;
            else {
                std::cout << total << std::endl;
                total = trans;
            }
        }
        std::cout << total << std::endl;
    } else {
        std::cerr << "No data?!" << std::endl;
        return -1;
    }
    return 0;
}