程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++基礎內容復習

C++基礎內容復習

編輯:C++入門知識

下列語句定義了5個變量:   int count;   double sales_price,sum;   std::string title;   Sales_item bookItem;   每個定義都是以類型說明符開始,如上int、double、std::string、Sales_item都是類型名,其中int和doubleshi是內置類型,std::string是標准庫定義的類型(需要#include <string>), Sales_item是自定義類型。   ::作用域操作符,含義是右操作符的名字可以在左操作數的作用域中找到   簡化std::string 的寫法是使用using。   比如使用using std::string; using std:cin;之後,在下面的代碼中就可以直接使用string和cin了。    當進行string對象和字符串字面量混合連接操作時,+操作符的左右操作數必須至少有一個是string類型的。   比如,如下s1的初始化時正確的          string item ="what a mess!";          string s1 =item +",";   但是:string s1 ="what a mess!" +",";   就會報錯,這個和C#是完全不一樣的。       雖然任何整數數值都可以作為索引,但是索引的實際數據類型卻是unsigned類型的string::size_type   vector vector是一個類模版(class template),是同一種類型的對象的集合,每個對象都有一個對應的整數索引值,功效上可以參考C#的IList<T>.例如:   vector<int> int_list;   vector的初始化有如下幾種方式:   vector<T> v1;//vector保存類型為T對象,默認構造函數v1為空   vector<T> v2(v1);//v2是v1的一個副本   vector<T> v3(n,i);//v3包含n個值為i的元素   vector<T> v4(n);//v4含有值初始化元素的n個副本   往隊尾插入元素的函數是push_back   迭代器:   每種容器類型都定義了一個自己的迭代器,比如:   vector<int>::iterator iter;   每種容器都定義了begin和end函數;   比如可以這樣寫:   vector<int> int_list(5,10);//初始化為5個10 vector<int>::iterator iter=int_list.begin();// 迭代器 將每一個迭代引用的元素設置為0:   for (vector<int>::iterator i =int_list.begin();i!=int_list.end();i++)     {         *i=0;     }     另外,所有的容器也還定義了另外一個迭代器,const_iterator,和iterator的區別是前者不可以修改容器元素的值。   vector<int>::const_iterator   不允許用const_iterator進行賦值操作。   任何改變vector長度的操作都會使已經存在的迭代器失效。比如調用push_back之後,就不能再信賴vector的迭代器的值了   數組: 數組的維數必須用大於等於1的整數常量表達式定義,這個常量表達式只能是整形字面常量、枚舉常量、或者常量表達式初始化的整型const對象。非const變量以及要到運行階段才知道其值的const變量都不能用於定義數組的維數。   復制代碼 int main() {     int getNumber();     const int  max_files=30;     const int otherNumber =getNumber();     std::cout<<otherNumber<<std::endl;     int staff_size=30;     char input_buffer1[11];     char input_buffer2[max_files];     //char input_buffer3[staff_size];//錯誤,staff_size是局部變量     //char input_buffer4[otherNumber];//錯誤,otherNumber是運行階段才知道其值的const變量     Console::WriteLine(L"Hello World");     Console::ReadLine();     return 0;   }     int getNumber() {     return 2; } 復制代碼 字符數組比較特殊,如下   char ca1[] = {'C', '+', '+'}; // 缺少 null char ca2[] = {'C', '+', '+', '\0'}; // 明確帶上 null char ca3[] = "C++"; // 自動添加上null ca1 的維數是 3,而 ca2 和 ca3 的維數則是 4。   另外,不允許數組直接復制和賦值。需要注意的是,一些編譯器允許將數組賦值作為編譯器擴展。但是如果希望編寫的程序能在不同的編譯器上運行,則應該避免使用像數組賦值這類依賴於編譯器的非標准功能。   與 vector 類型不同,數組不提供 push_back 或者其他的操作在數組中添加新元素,數組一經定義,就不允許再添加新元素。   在用下標訪問元素時,vector 使用 vector::size_type 作為下標的類型,而數組下標的正確類型則是 size_t。       指針 與迭代器一樣,指針提供對其所指對象的間接訪問,只是指針結構更通用一些。與迭代器不同的是,指針用於指向單個對象,而迭代器只能用於訪問容器內的元素。   在定義指針變量時,可用空格將符號 * 與其後的標識符分隔開來。如下三個寫法都是正確的:   std::string* sp =&s; std::string *sp =&s; std::string*sp =&s; 而std::string* sp1,sp2;這句實質上定義了sp1這一個指針,而sp2則是普通的string變量。   很多運行時錯誤都源於使用了沒有初始化的指針。   如果必須分開定義指針和其所指向的對象,則將指針初始化為 0。因為編譯器可檢測出 0 值的指針,程序可判斷該指針並未指向一個對象。   說明:   指針中的*操作符的含義是對指針進行解引用獲得該指針所指向的對象。解引用操作符返回左值,因此可為其結果賦值,等效於為該指針所指向的特定對象賦值。   &操作符則是返回操作數對象在內存中的存儲地址,不可賦值。   對指針進行初始化或者賦值只能使用一下四中類型的值:   0值常量表達式 類型匹配的對象的地址 另一對象末的下一地址 同類型的另一個有效指針 把int型變量賦值給指針是非法的,盡管此int型變量的值可能為0。   復制代碼 std::string s ="1234567"; std::string*sp =&s; int zero =0; int *ip=zero;//錯誤信息 error C2440: 'initializing' : cannot convert from 'int' to 'int *' int *ip1 =sp;//錯誤信息 error C2440: 'initializing' : cannot convert from 'std::string *' to 'int *'     int *ip2=&s;//錯誤信息 error C2440: 'initializing' : cannot convert from 'std::string *' to 'int *' 復制代碼 C++提供了一種特殊的指針 void *,他可以保存任何類型對象的地址   接上面的例子   void *ip1 =sp;//正確 void *ip2=&s;//正確 不過void *依然不能給賦值為int,即如下依然報錯(注意保存信息是void):   void *ip=zero;//錯誤信息 error C2440: 'initializing' : cannot convert from 'int' to 'void *' void* 指針只支持幾種有限的操作:與另一個指針進行比較;向函數傳遞void* 指針或從函數返回 void* 指針;給另一個 void* 指針賦值。不能使用void*指針操縱它所指向的對象。   ***注意如下,要cout字符串,必須#include <string>   復制代碼 std::string s1 ="1234567"; cout<<s1<<endl;//輸出:1234567 sp =&s1; std::cout<<sp<<endl; *sp="7878"; std::cout<<*sp<<endl;//輸出:7878 復制代碼 考慮以下兩個程序段。第一個程序段將一個指針賦給另一指針:   int ival1 = 1024, ival2 = 2048; int *pi = &ival1, *pi2 = &ival2; pi = pi2; // pi現在指向ival2     賦值結束後,pi 所指向的 ival 對象值保持不變,賦值操作修改了 pi 指針的值,使其指向另一個不同的對象。現在考慮另一段相似的程序,使用兩個引用賦值:   int &ri = ival1, &ri2 = ival2; ri = ri2; // 將ival2的值賦值給ival1 這個賦值操作修改了 ri 引用的值 ival 對象,而並非引用本身。賦值後,這兩個引用還是分別指向原來關聯的對象(&ri和&ri2這兩個地址的值依舊是原來的地址的值),此時這兩個對象的值相等。   可以通過四個輸出看出效果   復制代碼 int ival1=1204,ival2=2048; int &r1=ival1,&r2=ival2; std::cout<<r1<<","<<r2<<endl; std::cout<<&r1<<","<<&r2<<endl; r1=r2; std::cout<<r1<<","<<r2<<endl; std::cout<<&r1<<","<<&r2<<endl;//地址和上面的相同語句輸出顯示完全一樣      Console::WriteLine(L"Hello World"); Console::ReadLine(); 復制代碼 C++中,指針和數組密切相關,特別是在表達式中使用數組名時,這個名字會自動轉換為指向數組第一個元素的指針。如下:   復制代碼 int ia[] ={0,2,4,6,8}; int *ip=ia; int *ip1=&ia[0]; cout<<ip<<endl;// cout<<ip1<<endl; cout<<&ia[0]<<endl; cout<<&ia[1]<<endl; cout<<&ia[2]<<endl; cout<<&ia[3]<<endl; cout<<&ia[4]<<endl; 復制代碼     其中ip、ip1都等於&a[0],也就是數組的第一個元素的地址。   通常,在指針上加上(或者減去)一個整型數值n後,等效於獲得一個新指針,這個新指針指向指針原來指向的元素之後(或者之前)的第n個元素。上面的指針例子用的是int*,可能效果不明顯,換成string*來測試一下。   復制代碼 string ia[] ={"0","2","4","6","8"}; string *ip=ia; string *ip1=&ia[0]; cout<<"ip:"<<ip<<endl;// cout<<"ip1:"<<ip1<<endl; cout<<"&ia[0]:"<<&ia[0]<<endl; cout<<"&ia[1]:"<<&ia[1]<<endl; cout<<"&ia[2]:"<<&ia[2]<<endl; cout<<"&ia[3]:"<<&ia[3]<<endl; cout<<"&ia[4]:"<<&ia[4]<<endl; ip1=ip+1; cout<<"ip1+1之後的值:"<<ip1<<endl; Console::WriteLine(L"Hello World"); Console::ReadLine();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved