C++中對象的建立和使用

第二章 對象的建立和使用前端

 

1:翻譯器-源代碼轉化爲機器代碼(計算機能執行的形式)。一般能夠分爲兩類:解釋器(interpreter)和編譯器(compiler)ios

 

  解釋器:將源代碼轉化爲一些動做並當即執行這些動做。如PHPJavaScript。好處在於它從寫代碼到執行代碼的轉換幾乎是當即完成的,而且源代碼老是現存的,一旦出現錯誤能夠當即指出。而壞處是它必須從新翻譯任何重複的代碼,執行變慢,且必須駐留內存以執行程序數組

 

  編譯器:直接把源代碼轉化成彙編語言或機器指令。執行時不須要編譯器,直接在支持目標代碼的平臺上運行。能夠經過分段編譯各段程序提升效率。函數

 

編譯器和解釋器的工做流程可以下圖所示。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

 

4C++文件類型

一般,在一個C++程序中,只包含兩類文件——.cpp文件和.h文件。其中前面的叫作C++源文件,裏面存放的是C++源代碼,然後面的爲C++頭文件,裏面放的也是C++源代碼。C++支持「分別編譯」,能夠分別對不一樣的.cpp文件編譯後造成的目標文件進行一次連接(link)便可。所以,在a.cpp文件中定義的一個全局函數能夠經過b.cpp中調用,只須要在b.cpp中聲明這個函數(編譯時會產生一個符號表,連接時會根據符號表查源定義) 

 

頭文件是一個含有某個庫的外部聲明函數和變量的文件。頭文件不須要編譯的,當某個.cpp文件須要調用時,能夠經過宏命令「#include」將頭文件包含進這個.cpp文件中。.h文件不用寫在編譯器的命令以後,可是必定要在編譯器找的到的地方(#include <header> 是從環境或編譯器命令行指定的某種路徑中查找,而#includeheader.h」則是從當前目錄開始查找,若是沒找到再和前面的同樣查找)

 

5:一個簡單的C++程序

// hello.cpp

#include <iostream>   //C++中標準輸入輸出類

using namespace std;  //使用std名字空間

 

int main()

{

cout<<」helloworld」<<endl; //數據的標準輸出。其中用到了<<操做符重載

return 0;

}

在第三行中出現了名字空間的概念,所謂的名字空間就是一種描述邏輯分組的機制,也就是說若是有一些聲明按照某種準則在邏輯上屬於同一集團,就能夠把他們放在同一個空間中。它主要是用來避免類名的衝突,若是是僅僅包含頭文件,編譯器沒法找到任何有關函數和對象的聲明,使用using namespace A來指明調用這個「名字空間的聲明和定義」。

 

6vector簡介

C++vector是一個線性順序結構,至關於數組,可是其大小能夠不預先指定,而且能夠自動擴展。簡單的說,能夠看作是一個動態數組。因爲vectorC++標準庫的一部分,在使用時須要用頭文件#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對象的幾種操做

  1. v.push_back(t)    //在容器的最後添加一個值爲t的數據,容器的size變大。另外listpush_front()函數,在前端插入,後面的元素下標依次增大。 2. v.size()           //返回容器中數據的個數
  2. v.empty()        //判斷vector是否爲空 4. v[n]              //返回v中位置爲n的元素 5. v.insert(pointer,number, content)    //向vpointer指向的位置插入numbercontent的內容。還有v. insert(pointer, content)v.insert(pointer,a[2],a[4])a[2]a[4]三個元素插入。 6. v.pop_back()     //刪除容器的末元素,並不返回該元素。 7.v.erase(pointer1,pointer2)  //刪除pointer1pointer2中間(包括pointer1所指)的元素。vector中刪除一個元素後,此位置之後的元素都須要往前移動一個位置,雖然當前迭代器位置沒有自動加1,可是因爲後續元素的順次前移,也就至關於迭代器的自動指向下一個位置同樣。 8. v1==v2          //判斷v1v2是否相等。 9. =<<=>>=      //保持這些操做符慣有含義。 10. vector<typeName>::iterator p=v1.begin( );  //p初始值指向v1的第一個元素。*p取所指向元素的值。對於const vector<typeName>只能用vector<typeName>::const_iterator類型的指針訪問。 11.v.clear()      //刪除容器中的全部元素。

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「helloworld」 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); //移除從36string 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; }

相關文章
相關標籤/搜索