第二章 對象的建立和使用前端
1:翻譯器-源代碼轉化爲機器代碼(計算機能執行的形式)。一般能夠分爲兩類:解釋器(interpreter)和編譯器(compiler)。ios
解釋器:將源代碼轉化爲一些動做並當即執行這些動做。如PHP,JavaScript。好處在於它從寫代碼到執行代碼的轉換幾乎是當即完成的,而且源代碼老是現存的,一旦出現錯誤能夠當即指出。而壞處是它必須從新翻譯任何重複的代碼,執行變慢,且必須駐留內存以執行程序。數組
編譯器:直接把源代碼轉化成彙編語言或機器指令。執行時不須要編譯器,直接在支持目標代碼的平臺上運行。能夠經過分段編譯各段程序提升效率。函數
編譯器和解釋器的工做流程可以下圖所示。spa
2:靜態類型檢查命令行
在編譯器第一遍中會對函數的參數進行檢查,以防止出現程序設計錯誤。而靜態類型檢查是指在編譯階段而不是運行階段對其進行檢查。相反的,則是動態類型檢查。C++使用的就是靜態類型檢查。翻譯
3:聲明和定義設計
聲明(declaration)和定義(definition)在C++中是兩個不一樣的概念,聲明是向編譯器介紹名字-標識符。而定義是說明在此創建變量或函數併爲其分配內存空間。聲明能夠在多處不一樣的地方,可是隻能有一個定義。指針
int func1(int ,int ); //函數聲明,包括返回值類型,函數名,參數列表和分號對象
int func1(int a, int b){} //函數定義,與聲明不一樣在於它有函數體且用括號代替分號
int a; //這個能夠看作是一個變量聲明,也能夠看作是一個變量定義
定義聲明+初始化,判斷的主要原則是看是否佔用內存。例以下面的例子:
class MyClass //類的聲明,無內存佔有
{
string myString; //string的聲明
};
然而
#include<iostream>
//全局做用域
string myString;//定義,myString是實例化的string!
int main()
{
//Main函數體內
string myAnotherString;//定義,myAnotherString是實例化的string!
return 0;
} //類只是聲明,不是真正建立對象,所以在類中不能寫如const int len=10;這樣的語句!
extern關鍵字用於代表「這是一個變量可是不定義它,它的定義在別的地方」。 那麼上面的變量聲明能夠替換成extern int a。
4:C++文件類型
一般,在一個C++程序中,只包含兩類文件——.cpp文件和.h文件。其中前面的叫作C++源文件,裏面存放的是C++源代碼,然後面的爲C++頭文件,裏面放的也是C++源代碼。C++支持「分別編譯」,能夠分別對不一樣的.cpp文件編譯後造成的目標文件進行一次連接(link)便可。所以,在a.cpp文件中定義的一個全局函數能夠經過b.cpp中調用,只須要在b.cpp中聲明這個函數(編譯時會產生一個符號表,連接時會根據符號表查源定義)。
頭文件是一個含有某個庫的外部聲明函數和變量的文件。頭文件不須要編譯的,當某個.cpp文件須要調用時,能夠經過宏命令「#include」將頭文件包含進這個.cpp文件中。.h文件不用寫在編譯器的命令以後,可是必定要在編譯器找的到的地方(如#include <header> 是從環境或編譯器命令行指定的某種路徑中查找,而#include「header.h」則是從當前目錄開始查找,若是沒找到再和前面的同樣查找)
5:一個簡單的C++程序
// hello.cpp
#include <iostream> //C++中標準輸入輸出類
using namespace std; //使用std名字空間
int main()
{
cout<<」hello,world!」<<endl; //數據的標準輸出。其中用到了<<操做符重載
return 0;
}
在第三行中出現了名字空間的概念,所謂的名字空間就是一種描述邏輯分組的機制,也就是說若是有一些聲明按照某種準則在邏輯上屬於同一集團,就能夠把他們放在同一個空間中。它主要是用來避免類名的衝突,若是是僅僅包含頭文件,編譯器沒法找到任何有關函數和對象的聲明,使用using namespace A來指明調用這個「名字空間的聲明和定義」。
6:vector簡介
C++中vector是一個線性順序結構,至關於數組,可是其大小能夠不預先指定,而且能夠自動擴展。簡單的說,能夠看作是一個動態數組。因爲vector是C++標準庫的一部分,在使用時須要用頭文件#include <vector>將其包含進去。而且,它也是std標準名字空間的一部分,故使用時能夠直接用using namespace std便可。vector是一個類模板,而vector(int)是一種數據類型。
經常使用的vector構造函數
1:構造一個空元素的vector對象
vector <typename> v1;
2: 構造一個n個元素的vector對象(並不表述最多隻能是n個元素),初始值全爲0
vector <typename> v1(n);
3:構造n個元素的對象並初始化各元素項
vector <typename>v1(n, element());
4:構造一個原有的vector對象的拷貝
vector <typename>v1(v2);
vector對象的幾種操做
12.vector <typename>::size_type x; //vector <typename>類型的計數,可用於循環如同for(int i)
式例說明:
#include <iostream> #include <cassert> #include <vector> using namespace std; int main() { vector<string> v(5, "hello"); //構造並初始化v vector<string> v2(v.begin(), v.end()); //構造v2並使其等於v
assert(v == v2); //assert宏斷定表達式是否爲真,若爲假則先向標準錯物流打印一條出錯信息,而後經過調用abort來終止程序
cout<<"> Before operation"<<endl; for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it) cout<<*it<<endl; //經過it指針輸出v
v.insert(v.begin() + 3, 4, "hello, world"); //在3位置插入4個「hello,world」 cout<<"> After insert"<<endl; for(vector<string>::size_type i = 0; i < v.size(); ++i) //vector循環 cout<<v[i]<<endl;
vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); //移除從3到6的string assert(*it == "hello, world"); //判斷此時it是在哪裏 cout<<"> After erase"<<endl; for(vector<string>::size_type i = 0; i != v.size(); ++i) cout<<v[i]<<endl;
assert(v.begin() + v.size() == v.end()); assert(v.end() - v.size() == v.begin()); return 0; }