清華大學計算機系統網絡 | C++語言程序設計 | 答疑庫

1.學習C++是否必須先了解C?
  不是,C++與C的公共部分比C還容易學習,由於C++比C的類型檢查更嚴格更富於表現力,因此產生的錯誤就更少,又由於C++能使你毫不困難地描述更多的事物,因此所需的訣竅就更少,而且可利用的庫也要比C多.所要學習的C++子集並不是C的全部.
2.怎樣開始學習C++?
  很顯然,這非常依賴於你已經掌握的知識和你學習C++的動機.如果你是個編程新手,我強烈建議你找一位有經驗的程序員來幫助你.否則概念性的錯誤以及程序實際執行過程中所發生的問題將使你的學習大受挫折.
  你需要一本C++學習教程.該教程起到在線幫助文檔的作用. 其原因是帶有足夠多代碼的編程語言和庫文檔對概念的解釋不見得就很清楚。
  當選擇一本書時,要選將標準C++和標準庫結合在一塊描述的書.如,象字符串的輸入應這樣;
  string s;// 標準C++風格
  cin>>s;
  而不要象這樣:
  char s[MAX]; /* 標準C風格 */
  scanf("%s",s);
  多看看有豐富編程經驗的程序員推薦的書,記住,對任何人來說沒有哪一本是最好的,看看ACCU(C和C++用戶協會)站點上的書評.
  爲了寫出合乎習慣的C++語句,應避免簡單地用你以前學過的語言的風格寫C++代碼,僅僅通過改變句子排列順序是得不到什麼進步的.看看《Learning Standard C++ as a New Language》一書中關於如何學習C++的討論內容.
3.改進C++程序的最好方法是什麼?
  這我沒法說,主要取決於你如何用它,有很多人都輕視抽象類和模板.相反他們過多地使用casts和宏.
4.對於小的程序C優於C++,對嗎?
  我沒有這樣的觀點,我還未見過在不缺好的C++編譯器的情況下,有優於C++的C小程序
5.C是C++的子集嗎?
  從嚴格的數學意義上講,C不是C++的一個子集.有些程序是有效的C程序卻不是有效的C++程序,甚至在一些代碼的編寫方面,C與C++也有不同的意思.不過C++支持C所支持的每一種編程技術.每個C程序從本質上來講也都可以相同的方式用C++來編寫,並且有着相同的時間和空間效率.在幾小時內將幾萬行符合ANSI標準的C程序轉換成C++風格的C++程序是常見的.因此C++是ANSI C的超集就像ANSI C是K&R C的超集而ISO C++又是C++的超集一樣.
  一般的C程序都符合C++語法,比如Kernighan和Ritchie合著的《The C Programming Language》(第二版)中的任何一個例子也都是C++程序.
有關C/C++兼容的問題例子:
  int main()
  {
   double sq2=sqrt(2); /* 不是C++程序:調用了一個未聲明的函數 */
   int s=sizeof('a'); /* 在C中用 sizeof(int) . */
  }
  調用一個未聲明的函數是C中不好的風格而在C++中則是不合法的.
  void f();
  void g()
  {
   f(2);
  }
  在C語言中 void類型的指針能被轉換爲任意類型的指針,分配內存的典型做法是調用函數malloc().....
  void * malloc(size_t);
  void f(int n)
  {
   int *p=malloc(n*sizeof(char)); /*非C++用法,C++是用new分配內存的*/
   char c;
   void* pv=&c;
   int *pi=pv; /*隱含有將void類型指針轉換爲int類型的指針,在C++中不用*/
  }
  注意隱含地將void類型指針轉換爲int類型的指針會引起潛在的alignment錯誤.
  從C轉換到C++時,需注意C++的關鍵字要比C來的多
  int class =2; /* 在C中是正確的, 在C++中則有語法錯誤*/
  int virtual=3; /* 在C中是正確的, 在C++中則有語法錯誤*/
  除了一些象上面所舉的例子外(《The C++ Programming Language》(第三版)的附錄B中詳細列出了標準
  C++與C的這類區別)C++是C的一個超集(附錄B可以從網上下載)
6. C++與C有什麼區別?
  C++是C的直接後裔,幾乎將C當作一個子集而差不多保留了C的全部內容,C++提供了更強的類型檢查機制並直接支持範圍更廣的編程風格.在這種意義上說C++是"更好的C",它支持C語言的編程風格並有更好的類型檢查(又不失其原有的高效率).類似的,ANSI C 是比K&R C更好的C,另外C++支持數據抽象,面向對象的編程和類編程(請見《The C++ Programming Language》(第3版),可以從網上下載的附錄B中討論了兼容性問題.)
  我還未曾見過哪一個程序用C表達比用C++來得更好(我認爲不存在這樣一個C程序,其結構與C++完全等價)
  然而,在某些情況下由於C++得不到充分的支持,而使用C更有利.
  要理解有關C++的設計以及C++與C的關係的一些討論,請見《The Design and Evolution of C++》;
7.爲什麼用C++產生的“Hello World”的程序代碼要比用C產生的長十倍?
  在我的機器上不會有這種現象,在你的機器上也不會有.實際上,在我的機器“hello world”程序的C++版本的目標代碼比C要小.沒有語言方面的原因使得一種版本的程序代碼比另一種的要長.只有一種情況,那就是實現一種語言的人是如何組織標準庫的.如果一種版本要比另一版本大得多,則要向大的一方的實現者提出所發現的問題.
8.什麼是面向對象的程序設計(OOP)?
  面向對象的設計方法是一種進行程序設計的新方法,它吸取了結構化程序設計的先進思想,爲解決程序結構過於複雜而產生。它的思想是在進行程序設計時,把整個問題分成由相關部分組成的組,每個組考慮和組相關的代碼和數據,同時這些分組將按層次關係組織起來,每個分組轉換爲對象的獨立單元。面向對象的程序設計語言都具有多態性、繼承性、封裝性等特點。
9.通常的C++程序包括哪幾部分?
  C++是面向對象的程序設計語言,所以C++程序和C程序在風格上有很大不同。用戶編寫的C++程序通常分爲.cpp和.h兩類,.h文件中通常是類的定義,函數原型或說明以及數據的聲明等,然後在.cpp文件中通過包含(#include).h文件來使用。一個C++程序的結構通常是:在程序首部是預處理指令,可以聲明需要用到的類庫或者包含自定義的函數或類的.h文件,定義常量、宏等等。程序的主函數是main()函數,程序將從這裏開始執行。
10.什麼是類型轉換?
  當類型不同的變量出現在同一表達式中或者賦值符號兩邊時,會導致類型轉換。轉換的原則是賦值號右邊的值將被轉換成賦值號左邊變量的類型,然後賦給左邊的變量,同一表達式中的不同類型都將轉換成與最大類型操作數相同的類型,即從低位字向高位字轉換(如int轉爲float)。有時類型轉換會造成數據的丟失。也可以在變量前加(type)來強制使變量轉換爲需要的類型。比如說某個float類型的變量在輸出時需要輸出浮點數的信息,而同時它也作爲計數值在控制循環次數((int)varname)。
11.何時執行構造函數和析構函數?
  局部對象的構造函數在遇到對象說明語句時執行,並按遇到對象的順序依次調用,其析構函數則按構造函數的反序進行執行。全局對象的構造函數在main()開始之前執行,並在同一文件中按書寫順序依次執行,但是幾個文件之間的全局對象的構造函數執行順序是不可知的,其析構函數在函數main()結束之後按構造函數反序執行。
12. 如何創建數組?
  數組可以動態創建也可以靜態創建。當已知數組大小時,可以簡單的定義爲int array[10]。動態創建數組時數組大小可以是已知的,也可以是變元,此時用動態分配符new來創建,定義形式爲type *array=new type[size],當然用完數組時必須用delete[] array來釋放空間。由於動態創建數組是分配了一塊內存空間,因此當數組較大時最好靜態分配。對於多維數組,靜態分配同前,動態分配則從最高維開始依次用new分配,釋放時則從低維到高維依次delete[]。
13.C++會自動檢查數組越界嗎?
  回答是否定的,也就是說當你的數組越界使用時編譯程序不會報錯,而只能是在執行時產生非法操作或者得不到正確結果。因此在使用數組時一定要在編程時自己判斷是否越界以保證程序的正確性。
14.指針和數組有什麼關係?
  指針和數組之間是有密切的關係的。當創建一個數組後,雖然沒有定義,但是數組名即是一個指向該數組第一個元素的指針,同樣也可以用這個指針對數組進行操作。例如定義數組int array[10];int* p;p=array;執行後p即指向了數組的第一個元素array[0],最後一個語句相當於p=&array[0](很少這麼用)。而任何一個指針變量都可以以數組的方式使用,即通過指針加下標來改變指針的指向。例如定義指針變量int* p;則有p[1]==*(p++)。
15.指針使用中應注意哪些問題?
  指針雖然功能強大,使用靈活,但是很多時候它會導致致命的並且不容易發現的錯誤。因此使用指針時一定要特別小心,注意不要犯以下錯誤:首先,未經初始化的指針使用起來是很危險的,因爲它可能指向某個未知的內存空間,這樣對它操作可能導致嚴重的後果。解決方法是在使用指針前一定要初始化它的指向(有時null也是不安全的)。其次,對指針的錯誤理解也可能得不到正確結果甚至產生錯誤,如數組越界等。另外在使用delete時也容易產生指針錯誤,delete前一定要確認被釋放的指針指向的是有效地址,例如在釋放數組時如果忘記了[]將只釋放數組的第一個元素所佔的空間,而其餘元素將被程序"遺忘"在死區,而且很可能當時未被發現,但是如果程序過大或者多次執行將導致資源不足而使系統崩潰。總之由於指針是對內存的直接操作,所以稍不注意就可能產生錯誤。只有徹底瞭解指針的使用,並且在編程過程中時刻注意檢查指針的指向,指針纔會成爲有力的工具。
16.向函數傳遞參數有幾種方法?有什麼不同?
  向函數傳遞的參數可以是傳值參數,也可以是引用參數,還可能是指針。傳值時形式參數即簡單的寫成type varname,函數執行後將不改變實參的值。引用傳遞是把變元的地址傳給函數,形式參數寫成type &varname,調用時則直接寫實參的名字即可,因此函數執行後對實參varname的修改將被保留。指針傳遞就是把變量的指針傳給參數,形參形式爲type *varname,顯然函數將對指針指向的內存地址直接操作,修改將被保留。
17.什麼是類?
  類是面向對象程序設計的基礎。一個類定義了一種數據類型,有一點兒像C語言中的結構類型(struct)。從計算機科學的觀點來說,一種數據類型應該包括一系列的狀態和一系列的操作,操作引起狀態的轉化。
18.什麼是對象?
  在聲明一個整型變量時,我們會說:"int i;",這時我們的意思是,"i是整數類型的一個對象"。在面向對象的C++程序設計中,對象意味着類的實例。
19.什麼是友元?
  友元是C++爲某個類提供的允許其它類或者函數訪問它的機制。友元可以是函數,也可以是類。一個類可以給予它的友元存取和訪問自己的特權。
20.友元違反數據封裝原則嗎?
  恰當地應用友元,不但不會破壞封裝性,反而會加強它。
  在編程的時候,我們經常遇到這樣的情況,就是兩個類之間有着緊密的聯繫,它們常常需要互相訪問對方的數據和成員函數。實現這種編碼的最好方法,就是將這兩個類互相設置成友元。
  這樣做的好處是,我們可以使兩個類中的私有成員保持它的私有性。有些初級編程者爲了避免使用友元,常常將數據設置成public的,或者利用public的get()和set()對私有成員進行存取,這樣做實際上反而破壞了數據的封裝性。採用get()和set()這種存取函數的機制,與直接設置公有數據取得的效果,幾乎一樣差。它們只是將私有數據成員的名字隱藏了起來,而私有數據成員其他的一切,都暴露出來。
  同樣,將一些函數設置成友元也不會影響類的封裝特性。友元函數和類的成員函數一起,構成了類的封裝邊界。換句話說,友元函數對於封裝帶來的影響,就如同成員函數的影響一樣。誰會說成員函數影響了類的封裝性呢?
21.構造函數是用來做什麼的?
  "構造函數從塵土中建造大樓"。構造函數完成對象的初始化工作,它們將一堆毫無意義的比特轉化成一個個活生生的對象。它們爲對象初始化各種數據,並分配各種資源,包括內存、文件、socket等等。
22.假設List是一個類的名字,那麼"List x"和"List x()"之間有區別嗎?
  區別大了!
  舉例說明:函數f()聲明瞭一個List類的局部對象x:
  void f()
  {
   List x; // 局部對象x
   // ...
  }
  但是,函數g()在內部聲明瞭一個函數x,它返回List的一個對象:
  void g()
  {
   List x(); //局部函數,函數名x
   // ...
  }
23.析構函數通常做什麼工作?
  析構函數用來釋放對象所佔有的所有資源,包括內存、文件、socket連接等等。它的工作一般和構造函數的初始化工作相對。最常見的例子就是構造函數用new,而析構函數用delete。
24.編寫析構函數時,需要顯式調用成員對象的析構函數嗎?
  不需要。
  類的析構函數自動調用成員對象的析構函數。
25.編寫派生類的析構函數時,需要顯式調用基類的析構函數嗎?
  不需要。
  派生類的析構函數自動調用基類的析構函數。
26.結構和類有什麼區別?
  C++擴展了C中的結構,使結構也可以定義類。唯一的區別是,class定義的類中的缺省訪問級別是private,而struct定義中缺省級別爲public。
27.聯合與類有什麼區別?
  聯合也可以用來定義類,與結構類似其缺省訪問級別是public。如果要求創建的對象的元素共享同一內存地址時就用union來定義該類。但是使用聯合定義類時有以下限制:聯合不能繼承其他的類,也不能被繼承,不能含有虛成員函數,不能有靜態成員變量,不能有重載運算符"="的對象作成員,不能有含有構造函數和析構函數的對象作成員。
28.哪些運算符可以被重載?哪些不能?
  大部分運算符都可以被重載,不能被重載的運算符有 "。" , "?:", "::" 和 "*" 。
29.如何進行文件操作?
  要處理文件I/O,程序首部必須包含頭文件fstream.h。其中定義了ifstream,ofstream,fstream等類,它們分別從istream和ostream派生而來,而istream和ostream是從ios派生而來,所以ifstream,ofstream,fstream可以存取ios定義的所有運算。需要注意進行文件操作(打開、讀寫)時都需要檢測操作是否成功以保證程序正確進行處理。
30.如何打開和關閉一個文件?
  通過把文件和流聯繫起來打開文件。打開文件之前要先獲得一個流(輸入流ifstream,輸出流ofstream或者輸入輸出流fstream)。然後使用函數open()把流和文件聯繫起來打開文件,其原型爲void open(char *filename,int mode,int access);其中filename爲文件名,mode值爲文件打開方式,access值爲存取文件方式。實際上常常不調用函數open()而直接用ifstream或ofstream的構造函數來打開文件。要關閉一個文件,就用該文件關聯的流調用成員函數close()即可。
31.如何讀寫一個文件?
  讀寫文本文件時只需將與文件相關聯的流與運算符<<、>>連用即可。但是這樣讀寫文本時將發生某些字符轉換,爲避免這種情況,可採用C++的二進制I/O函數put(),get(),read()和write()。它們的原型即說明如下:
  istream &get(char &ch);//從流中讀入一個字符存入ch中,返回對流的引用。
  ostream &put(char ch); //將ch寫入流,返回對流的引用。
  istream &read(unsigned char *buffer,int num);
  //從相關流中讀入num個字節存入buffer所指的緩衝區中,返回對流的引用。
  ostream &write(const unsigned char *buffer,int num);
  //把buffer所指的緩衝區中的num個字節寫入相關的流中,返回對流的引用。
32. 如何判斷文件結束?
  成員函數eof()可以跟蹤何時到達文件尾,當到達文件尾時eof()返回值不爲0,否則爲0。
33.new和delete比 malloc和free有哪些優點?
  new和delete完成與malloc和free相似的功能,但是它們相比之下有以下優點:
  i. 用new自動分配空間時容量是自動計算的,不必使用sizeof運算符,所以能夠分配到足夠的空間以容納指定類型的對象,避免發生錯誤。
  ii. 用new分配內存後將自動返回指定對象類型的指針,而用malloc則需顯式的使用強制類型轉換。
  iii. new和delete都可以重載,而malloc和free不存在此功能。
34. C++中可以使用printf()和scanf()嗎?
  可以,因爲C++是兼容C的功能的。但是C++中有自己的輸入輸出符號:<<和>>。例如語句cout<<"Hello" <<" world!\n"將在屏幕上輸出Hello world!並換行。cout,cin與<<和>>連用可以處理C++的任何內部數據類型。與printf和scanf相比它們具有如下優點:安全,編譯器會靜態地事先得知變量類型而不是由%動態獲得;簡單快速,不易出錯;而通過重載運算符<<和>>,可以對用戶定義的對象直接進行輸入輸出操作,這是printf和scanf所不能及的。
35.C++中的輸出cout<<能夠指定輸出數據的域寬和精度嗎?
  可以通過設置格式標誌來完成,另外流類ios還有三個成員函數來設置格式參數。它們分別是:
  int width(int w);//設置域寬,w爲新域寬,返回以前的域寬。
  int precision(int p);//設置精度,p爲設置的精度,返回原來的精度值。
  char fill(char ch);//設置填充字符,ch爲新的填充字符,返回原來的值。
  它們都可以由cout調用。
36.如何向函數傳遞數組?
  對於傳遞的一維數組,形式參數可以寫成指針、有界數組、無界數組三種方式,例如void fun(int *x)或者void fun(int x[10])或者void fun(int x[])。這三種方法效果相同,在調用時實參均應該是指向數組的指針。傳遞多維數組時,除第一維外其餘各維大小必須指定,如void fun(int x[][2][6])。
37. 我如何才能防止其他的程序員看到我的類的私有成員從而維護數據封裝性呢?
  這個問題本身就存在問題。封裝針對的是編碼,而不是程序員。
  其他程序員看到你編寫的類的私有成員,並不意味着這個類的封裝性被破壞了,只要這些程序員不依賴於他們所看到的私有成員編寫他們的程序,那麼你的類的封裝性就沒有受到任何影響。"私有"這個詞是針對類而言的,不是針對你和其他程序員。
38.封裝是一種安全機制嗎?
  不是。
  封裝並不等於安全。封裝是用來防止錯誤發生的,封裝不能用來防間諜。
39.可以向構造函數傳遞變元嗎?
  可以。通過向構造函數傳遞變元,可以對對象進行特定的初始化。
40.如何向函數傳遞對象?
  傳遞對象參數可以和傳遞其他類型的參數使用相同的方法。對象可以通過傳值方式傳遞給函數,也就是傳遞給了函數一個拷貝。由於是相當於創建了一個新對象,那麼它的構造函數和析構函數是否要執行呢?結果是這樣的:新對象沒有執行構造函數,但是函數結束時執行了析構函數。原因是新對象應該保持原對象的狀態,因此不能執行構造函數重新初始化,而是執行拷貝構造函數,而最後這個拷貝還是要被撤銷的,所以要執行析構函數。當然,如果希望對象能夠被函數改變也可以向函數傳遞對象的引用或者指針。
41. 爲什麼友元關係不具有傳遞性,也不能通過繼承得到?
  很明顯,這麼做是合情合理的。拿生活中的朋友關係類比:我宣稱你是我的朋友,但這並不代表我也認爲你的兒女或者你的朋友也是我的朋友。
  對於你朋友的兒女,你不一定信任,這說明朋友關係不能繼承。如果class C聲明class Base是一個友元類,並且class Derived是class Base的派生類,class Derived並不能自動的成爲class C的友元。
  對於你朋友的朋友,你不一定信任,這說明朋友關係不能傳遞。如果class Bob聲明class John是一個友元類,並且class John聲明class Salla是一個友元類,class Salla並不能自動的成爲class Bob的友元類。
42. 如何在一個構造函數的內部調用另一個構造函數?
  這是不可能辦到的。如果你調用了另一個構造函數,編譯器將創建一個臨時局部對象,而對於當前的對象起不到任何初始化作用。如果想要兩個構造函數共享代碼,可以創建一個私有成員函數initial(),在兩個構造函數中分別調用它即可。
43. 對於類C來說,缺省構造函數一定是C::C()的形式嗎?
  不是這樣的。
  缺省構造函數是這樣一類構造函數:調用它時可以不給出任何參數。所以不帶任何參數的構造函數當然是缺省構造函數,比如:
  class C
  {
   C(); //缺省構造函數
  };
  但是,缺省構造函數也可以帶有參數,只要這些參數都具有缺省值即可,比如:
  class C
  {
   C(int a=0, int b=0); //缺省構造函數
  };
44.爲什麼含有靜態成員的類產生鏈接錯誤?
  產生這種錯誤的原因通常是編程者沒有滿足這樣一條原則:類的靜態數據成員必須被顯式的定義,並且只能在一個編譯模塊中定義一次。如果你違反這一原則,就會得?quot;undefined external" linker error。舉例說明:
  // Fred.h
  class Fred {
   public:
   // ...
  private:
   static int j_; // 聲明靜態數據成員 Fred::j
   // ...
  };
  你必須在某個文件中定義Fred::j,否則鏈接不能通過,比如在Fred.cpp文件中定義它:
  // Fred.cpp
  #include "Fred.h"
  int Fred::j_ = 0;
45.局部對象的析構順序是怎樣的?
  局部對象按照它們建立順序的反順序進行析構。最早創建的對象最晚被析構。
  在下面的例子中,b的析構函數首先被調用,然後是a的析構函數。
  void f()
  {
   C a;
   C b;
   //……
  }
46. 能夠重載類的析構函數嗎?
  不能。
  對於一個類來講,只能有一個析構函數,也一定是class_name::~class_name()的形式。析構函數沒有任何參數,也沒有返回值。我們不能傳遞給析構函數什麼參數,因爲我們不能顯式的調用析構函數。
47. 如果我的對象是通過new創建的,那麼我可以顯式的調用析構函數清除這個對象嗎?
  不能。
  你必須通過delete來清除這個對象。delete操作自動調用相應的析構函數,但是它比析構函數多做了一件重要的事情,它釋放了對象本身佔有的內存。需要銘記在心的是:delete做了兩件事情,它調用了析構函數,並且釋放了對象佔用的內存。
48.說明指針變量和引用變量時,*或&應該與類型名連在一起還是變量名連在一起?
  當定義單個變量時這兩種做法是一樣的,只是反映了不同的風格而已,可以認爲與類型名連在一起時得到一種指針類型。但是實際上並非如此,當多個變量同時定義時也許會出現問題,如int* a,b;將會定義一個指針類型變量a和一個整型變量b。因此只要清楚真正的含義,在實際應用時可以靈活一些而不會出錯。
49. 如何進行操作符重載?
  操作符重載是十分有用的,特別是在面向對象的程序設計中,可以對自定義的對象直接用操作符連接,增強了直觀性,例如重載加號+使它完成兩個複數(用戶定義的類)的加法。進行操作符重載時需要用到關鍵字operator,爲某個類的對象重載操作符的成員函數定義形式爲:returntype operator#(para-list);其中returntype是操作後返回的數據類型,通常是參與計算的對象的類型,#代表被重載的操作符,當#是單目操作符時參數表爲空,當#爲雙目操作符時參數表中將是右操作數。也就是說是操作符左邊的對象調用的函數。也可以用friend來重載關於類的運算符,這時函數將不是類的成員(沒有this指針)。這樣重載函數將顯式的傳遞操作數,所以重載單目操作符將有一個參數,而重載雙目操作符將有兩個參數。但是不能用friend重載=,(),->運算符,而且參數需要是引用類型。
50. 在函數定義中使用const修飾符有何作用?
  關鍵字const可以說明常量,但是在函數定義中有更大的作用。當函數的參數是指針或者引用變量時(非傳值參數),如果前面加修飾符const,則可以避免被指向或被引用的變量。當成員函數被const修飾時,例如void fun() const;則表示該函數不會對調用它的對象產生影響。
51. 派生類可以繼承基類的哪些部分?
  基類中的所有聲明爲public和protected的成員,派生類都可以繼承,但是聲明爲private的部分,派生類則無權繼承,這是爲了將來基類中的(私有)成員一旦修改不會影響到其派生類。
52. public,protected,private有什麼區別?
  它們都是類成員的訪問級別,public標註的成員具有公有級別,也就是其他函數或者類的對象都可以訪問它;private表示私有成員,它們不能被本類以外的對象或者函數引用;protected修飾的成員是保護成員,除了本類或本類的派生類可以存取外其他都無權訪問。
53. 爲什麼要使用模板?
  有些操作對不同數據類型的數據操作相同,但是不得不對各個數據類型分別編寫代碼。爲了讓程序更加簡潔通用,用template關鍵字將不同類型數據的共同操作定義成模板,以後某個類型的數據需要進行這個操作時就可以只指定數據類型以後直接調用該模板。可以編寫模板函數,也可以編寫模板類(可以根據不同的數據類型生成不同的對象),定義時只需在前面加上template <class T>,T表示程序中待定的數據類型。模板函數在調用時無需顯式指定數據類型,直接調用即可;模板類調用時需在程序中需要指定數據類型的尖括號內給出具體的數據類型(如int)。
54. C++中可以嵌入彙編嗎?
  可以的,通過關鍵字asm可以將彙編語言直接嵌到C++程序中。語法爲:
  asm("string")或者asm instru或者asm{instru sequence},其中string,instru,instru sequence都是傳給彙編程序的彙編語句。如果對彙編語言很精通,有時候在C++程序中嵌入彙編代碼將會大大提高程序的效率。
發佈了82 篇原創文章 · 獲贊 17 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章