2020年,給自己定一個新目標————開始寫技術博客,將之前所學的內容重新複習並整理成一系列的文章,一來可以讓自己對這些基礎知識更加熟悉,二來方便於以後的複習查閱。 以前自己都是以筆記的形式將知識點記錄在有道雲筆記中,這樣可能造成由於時間緊或者懶,只是記錄了筆記,沒有去深刻的理解。所以乘著這次全面復 ...
2020年,給自己定一個新目標————開始寫技術博客,將之前所學的內容重新複習並整理成一系列的文章,一來可以讓自己對這些基礎知識更加熟悉,二來方便於以後的複習查閱。
以前自己都是以筆記的形式將知識點記錄在有道雲筆記中,這樣可能造成由於時間緊或者懶,只是記錄了筆記,沒有去深刻的理解。所以乘著這次全面複習的機會,把基礎知識都整理成文章的形式,對各個知識點加深理解,耗時可能比較長,但是一定要堅持。
本系列文章為C++知識的集合,我想結合《C++ Primer》、《STL源碼剖析》、《深度探索C++對象模型》、《Effective C++》、《More Effective C++》這5本書,從易到難地把C++知識點整理一遍。
首先,從輸入/輸出開始,簡單地認識一下C++:
#include <iostream>
int main()
{
std::cout << "Enter two numbers: ";
int num1, num2;
std::cin >> num1 >> num2;
std::cout << "The sum is: " << num1 + num2 << std::endl;
return 0;
}
這段代碼的作用就是:輸入兩個整數,輸出它們的和。
頭文件iostream包含了該程式需要使用到的輸入流(istream)和輸出流(ostream),而cin、cout為輸入、輸出的對象,endl是一個被稱為操縱符(manipulator)的特殊值,輸出它的作用就是結束當前行,並且刷新緩衝區。
緩衝刷新操作可以保證到目前為止,程式所產生的所有輸出都真正寫入輸出流中,而不是僅停留在記憶體中等待寫入流,這在日誌系統中很有用。
首碼std::指出這些名字(cin、cout、endl)是定義在名為std的命名空間(namespace)中的。
試想,如果輸入的不是整數,而是字元,會發生什麼呢?答案是,流會失效,後面寫到標準IO庫時再細說。
在《Effective C++》中,如是說,C++已是一個多重範型的編程語言,同時支持過程形式(procedural)、面向對象形式(object-oriented)、函數形式(functional)、泛型形式(generic)、元編程形式(metaprogramming)。
使用C++最簡單的方法就是將C++看作一個由相關次語言組成的聯合,分為四個次語言:
- C C++仍是以C為基礎
- Object-Oriented C++ 也就是C with classes,包括構造/析構,封裝(encapsulation),繼承(inheritance),多態(polymorphism)
- Template C++ C++泛型編程(generic programming)部分,模板元編程(template metaprogramming, TMP)
- STL 對容器(containers)、迭代器(iterators)、演算法(algorithms)以及函數對象(function objects)的規約有極佳的緊密配合與協調
本系列文章也將圍繞這4個部分來詳細地介紹C++。