《Accelerated C++》筆記(1~3)
第0章 開始學C++
//C0
#include <iostream>
int main()
{
std::cout<<"Hello,World!"<<endl;
return 0;
}
0.1 註釋
0.2 #include指令
C++中有許多基本工具,例如輸入輸出,但其都不屬於語言核心,而是在標準庫中,因此需要使用#include指令指明使用的標準庫。
0.3 主函式main
函式是一段具有名稱的程式,程式其它部分可以呼叫函式或使之執行。每個C++程式都必須包含一個名為main的函式。main函式需要返回一個整數型別的值作為結果,來告知編譯器其是否執行成功,0表示成功。
0.4 花括號
花括號告訴編譯器,其之間的內容作為一個單元處理。
0.5 使用標準庫進行輸出
0.6 返回語句
0.7 一些較為深入的觀察
表示式會讓編譯器進行運算,產生結果的同事可能具有副作用。表示式含有運算元與運算子。每一個運算元具有相應型別。運算子具有優先順序與結合性保證運算順序。
例如標準的輸出std::cout<<"Hello,World!"<<std::endl;<<運算子是左結合,endl是一個控制器。控制輸出的形式。std::cout是一個限定名稱,::運算子是作用域解析符。
0.8 小結
型別:定義了資料結構以及這些資料結構的操作。
名字空間:將有相關的名稱聚集在一起。
字串直接量:從雙引號開始結束於雙引號。
定義與標頭檔案
主函式
花括號與分號
輸出
第1章 使用字串
//C1 #include <iostream> #include <string> int main() { std::cout<<"Please enter your first name:"; std::string name; std::cin>>name; std::cout<<"Hello,"<<name<<"!"<<std::endl; return 0; }
1.1 輸入
為了讀取輸入,需要有對應的存放空間,而這樣的空間即為變數。變數是一個具有名稱的物件,物件是計算機中一段具有型別的記憶體空間。
std::string name;是一個定義,而這個定義存在於函式體內,因此name是一個區域性變數,在對應的單元執行結束後被銷燬。在定義的同事,string型別對name進行了隱式的初始化,因為標準庫妖氣每個string物件都有一個初始化值。而隱式初始化後的name為一個空字串。預設初始化取決於變數的型別。
隱含在物件型別中的還有其介面,即該型別物件可以實現的操作集合。
在使用cin時,會首先略去輸入開始時碰到的空白字元,然後連續地讀取,直到遇到了另一個空白字元或檔案結束標記為止。(如果想輸入帶有空格的字串,可以考慮使用getline())。
輸入操作有一個副作用,即產生一個出現在計算機輸出裝置的提示。一般來說,輸入/輸出庫會將字元儲存在緩衝區。在有必要時才會將緩衝區內容寫入輸出裝置從而重新整理緩衝區。引起緩衝區重新整理的事件有三種:緩衝區滿了;請求庫從標準輸入流中讀資料;人為控制進行重新整理。
1.2 為姓名裝框
字串與字串直接量具有不同型別。
可以使用+將字串與字串直接量連線起來,在此過程中發生了型別的轉換。
const,用來表示常量的關鍵字,可以作為變數定義的一部分。如果定義一個變數為常量,需要在定義時對其初始化,否則之後再無法對其進行修改操作。
構造
成員變數
字元直接量
1.3 小結
型別:char內建型別,儲存由系統環境定義的普通字元;wchar_t內建型別,儲存寬字元,例如日語。
變數
第2章 迴圈與計數
while語句
while(condition) statement statement既可以是單獨的語句也可以是語句塊。while開始時先測試其條件,再根據條件真假繼續執行下面的程式。
邏輯運算子
for迴圈
for(init-statement condition;expression) statement
if語句
第3章 使用批量資料
#include <iostream>
#include <iomanip>
#include <ios>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::precision;
int main()
{
cout<<"Please enter your first name:";
string name;
cin>>name;
cout<<"Hello,"<<name<<"!"<<endl;
cout<<"Please enter your midterm and final exam grades:";
double midterm,final;
cin>>midterm>>final;
cout<<"Enter all your homework grades,"
"followed by end-of-file:";
int count = 0;
double sun = 0;
double x;
while(cin>>x)
{
++count;
sun+=x;
}
streamsize presc=cout.precision();
cout<<"Your final grade is"<<setprecision(3)
<<0.2*midterm+0.4*final+0.4*sum/count
<<setprecision(prec)<<endl;
return 0;
}
標頭檔案<ios> 定義了sreamsize型別,表示輸入輸出庫的長度型別。<iomanip>定義了控制器setprecision。可以指明輸出包含的有效位數。
3.3.1 檢測輸入
while(cin>>x){/*...*/}
3.2.1 把資料集合儲存在向量中 vector 模板類
3.2.2 產生輸出 使用語言工具typedef為特定型別產生一個自定義的替代名
3.2.3 一些更為深入的觀察
所有標準庫長度型別一樣。
普通整數與無符號整數在表示式中結合在一起時,普通整數會被轉換成無符號整數。
C++標準對庫的執行效能要求很高,例如vector,在vector後面新增大量元素是,其效能不會隨元素數量增加而成比例惡化;以不低於nlog(n)的速度實現排序演算法。