小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C++常見問題解答

 afskd 2011-03-30
引言篇
1.學(xué)習(xí)C++是否必須先了解C?
2.怎樣開始學(xué)習(xí)C++?
3.改進(jìn)C++程序的最好方法是什么?
4.對于小的程序C優(yōu)于C++,對嗎?
5.C是C++的子集嗎?
6.C++與C有什么區(qū)別?
7.為什么用C++產(chǎn)生的"Hello World"的程序代碼要比用C產(chǎn)生的長十倍?
8.什么是面向?qū)ο蟮某绦蛟O(shè)計(OOP)?
基礎(chǔ)篇
9.通常的C++程序包括哪幾部分?
10.什么是類型轉(zhuǎn)換?
11.何時執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)?
12.如何創(chuàng)建數(shù)組?
13.C++會自動檢查數(shù)組越界嗎?
14.指針和數(shù)組有什么關(guān)系?
15.指針使用中應(yīng)注意哪些問題?
16.向函數(shù)傳遞參數(shù)有幾種方法?有什么不同?
17.什么是類?
18.什么是對象?
19.什么是友元?
20.友元違反數(shù)據(jù)封裝原則嗎?
21.構(gòu)造函數(shù)是用來做什么的?
22.假設(shè)List是一個類的名字,那么"List x"和"List x()"之間有區(qū)別嗎?
23.析構(gòu)函數(shù)通常做什么工作?
24.編寫析構(gòu)函數(shù)時,需要顯式調(diào)用成員對象的析構(gòu)函數(shù)嗎?
25.編寫派生類的析構(gòu)函數(shù)時,需要顯式調(diào)用基類的析構(gòu)函數(shù)嗎?
26.結(jié)構(gòu)和類有什么區(qū)別?
27.聯(lián)合與類有什么區(qū)別?
28.哪些運算符可以被重載?哪些不能?
29.如何進(jìn)行文件操作?
30.如何打開和關(guān)閉一個文件?
31.如何讀寫一個文件?
32.如何判斷文件結(jié)束?
提高篇
33.new和delete比 malloc和free有哪些優(yōu)點?
34.C++ 中可以使用printf()和scanf()嗎?
35.C++中的輸出cout<<能夠指定輸出數(shù)據(jù)的域?qū)捄途葐幔?/a>
36.如何向函數(shù)傳遞數(shù)組?
37.我如何才能防止其他的程序員看到我的類的私有成員從而維護(hù)數(shù)據(jù)封裝性呢?
38.封裝是一種安全機(jī)制嗎?
39.可以向構(gòu)造函數(shù)傳遞變元嗎?
40.如何向函數(shù)傳遞對象?
41.為什么友元關(guān)系不具有傳遞性,也不能通過繼承得到?
42.如何在一個構(gòu)造函數(shù)的內(nèi)部調(diào)用另一個構(gòu)造函數(shù)?
43.對于類C來說,缺省構(gòu)造函數(shù)一定是C::C()的形式嗎?
44.為什么含有靜態(tài)成員的類產(chǎn)生鏈接錯誤?
45.局部對象的析構(gòu)順序是怎樣的?
46.能夠重載類的析構(gòu)函數(shù)嗎?
47.如果我的對象是通過new創(chuàng)建的,那么我可以顯式地調(diào)用析構(gòu)函數(shù)清除這個對象嗎?
48.說明指針變量和引用變量時,*或&應(yīng)該與類型名連在一起還是變量名連在一起?
49.如何進(jìn)行運算符重載?
50.在函數(shù)定義中使用const修飾符有何作用?
51.派生類可以繼承基類的哪些部分?
52.public,protected,private有什么區(qū)別?
53.什么要使用模板?
54.C++中可以嵌入?yún)R編嗎?

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多