1.C++中類與結(jié)構(gòu)的唯一區(qū)別是:類(class)定義中默認(rèn)情況下的成員是private的,而結(jié)構(gòu)(struct)定義中默認(rèn)情況下的成員是public的。
2. ::叫作用域區(qū)分符,指明一個函數(shù)屬于哪個類或一個數(shù)據(jù)屬于哪個類。::可以不跟類名,表示全局?jǐn)?shù)據(jù)或全局函數(shù)(即非成員函數(shù))。
3.類名加載成員函數(shù)名之前而不是加在函數(shù)的返回類型前。
錯誤:Tdate::void Set(int m , int d , int y) {}
正確: void Tdate::Set(int m , int d , int y) {}
4.一個類對象所占據(jù)的內(nèi)存空間由它的數(shù)據(jù)成員所占據(jù)的空間總和所決定。類的成員函數(shù)不占據(jù)對象的內(nèi)存空間。
5.類的成員函數(shù)可以訪問該類的private成員。
6.類作用域是指類定義和相應(yīng)的成員函數(shù)定義范圍。在該范圍內(nèi),一個類的成員函數(shù)對同一類的數(shù)據(jù)成員具有無限制的訪問權(quán)。
7.#include <filename.h> 和#include “filename.h” 有什么區(qū)別?
答:
對于#include ,編譯器從標(biāo)準(zhǔn)庫路徑開始搜索filename.h
對于#include “filename.h”,編譯器從用戶的工作路徑開始搜索filename.h
8.
[cpp]view plaincopy
int?a?=?1?,?b?=?0;??
MAX(a++?,?b);//a被增值2次??
MAX(a++?,?b?+?10);//a被增值1次??
MAX(a++ , b)的值為2,同時a的值為3;
MAX(a++ , b + 10)的值為10,同時a的值為2
9.類定義是不分配空間和初始化的。類是一個抽象的概念,并不是一個實體,并不含有屬性值,而只有對象才占有一定的空間,含有明確的屬性值。
10.運行如下代碼:

class A
{public:
? ? A(intj):age(j) , num(age +1)
? ? ? ? //...protected:
? ? int num;
? ? int age;
};void mian()
{
? ? A sa(15);
}

代碼運行結(jié)果:num=“隨機值 ”, age= 15
由于按成員在類定義中的聲明順序進(jìn)行構(gòu)造,而不是按構(gòu)造函數(shù)說明中冒號后面的順序,所以num成員被賦的是一個隨機值,并不是想賦的16,因為這個時候,成員age還沒有被賦值,age的內(nèi)存空間中是一個隨機值。
11.如果 const 出現(xiàn)在 * 左邊,則指針指向的內(nèi)容為常量;如果 const 出現(xiàn)在 * 右邊,則指針自身為常量;如果 const 出現(xiàn)在 * 兩邊,則兩者都為常量。
[cpp]view plaincopy
<<effective?C++>>上有個好記的方法:const在*號左邊修飾的是指針?biāo)傅膬?nèi)容;const在*號右邊修飾的是指針。??
簡單記就是:左內(nèi)容,右指針。??
我只要一聽到被面試者說:"const意味著常數(shù)",我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded
Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:
1). 關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)
2). 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。
3). 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。
const的用法參考:http://blog.csdn.net/hyg0811/article/details/9349869
12.C++一維數(shù)組和指針的關(guān)系總結(jié)
對于數(shù)組int a[10];a表示數(shù)組的第一個元素的地址,即&a[0];
如果使指針p,指向數(shù)組的首元素,可以進(jìn)行操作:int * p=a; 或者int *p=&a[0];
那么p++,是指向數(shù)組中的先一個元素,即a[1];
此時*p則是a[1]中所放的值。
此時,a[i]=p[i]=*(a+i)=*(p+i)
關(guān)于*p++,由于++和*的優(yōu)先級相同,結(jié)合方向是自右而左,因此它等價于*(p++)。作用是:先得到p指向的變量的值(即*p),然后再使指向p的值加1.
*p++等價于*(p++);而*(++p)表示先使p+1,再取*p。
13.在VC中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據(jù)sizeof后面的參數(shù)對sizeof的用法做個總結(jié)。
A.參數(shù)為數(shù)據(jù)類型或者為一般變量:
例如sizeof(int),sizeof(long)等等。
這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的。
例如int類型在16位系統(tǒng)中占2個字節(jié),在32位系統(tǒng)中占4個字節(jié)。
B.參數(shù)為數(shù)組或指針:
int a[50]; //sizeof(a)=4*50=200;求數(shù)組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針的大小,在32位系統(tǒng)中,當(dāng)然是占4個字節(jié)。
C.參數(shù)為結(jié)構(gòu)或類:
Sizeof應(yīng)用在類和結(jié)構(gòu)的處理情況是相同的,需要考慮字節(jié)對齊(參加另一篇文章:http://www.cnblogs.com/heyonggang/archive/2012/12/11/2812304.html)。另外有幾點需要注意:
第一、結(jié)構(gòu)或者類中的靜態(tài)成員不對結(jié)構(gòu)或者類的大小產(chǎn)生影響,因為靜態(tài)變量的存儲位置與結(jié)構(gòu)或者類的實例地址無關(guān)。
第二、沒有成員變量的結(jié)構(gòu)或類(非虛)的大小為1,因為必須保證結(jié)構(gòu)或類的每一個實例在內(nèi)存中都有唯一的地址。
第三、包含虛函數(shù)的類或者虛繼承的類,需要算上虛表指針的占的4個字節(jié)。
下面舉例說明:
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指針。
Class test1{ };//sizeof(test1)=1;
Class test2{ virtual void print(){}};//sizeof(test2)=4;
14.運算符new分配堆內(nèi)存,如果成功,則返回指向該內(nèi)存的空間,如果失敗,則返回NULL。所以每次使用運算符new動態(tài)分配內(nèi)存時,都應(yīng)測試new的返回指針值,以防分配失敗。

1Person::Person(Person &p)2{3cout<<"Copying "<

15.如果你的類需要析構(gòu)函數(shù)來析構(gòu)資源,則它也需要一個拷貝構(gòu)造函數(shù)。
由于C++提供的默認(rèn)拷貝構(gòu)造函數(shù)只是對對象進(jìn)行淺拷貝復(fù)制。如果對象的數(shù)據(jù)成員包括指向堆空間的指針,就不能使用這種拷貝方式,此時必須自定義拷貝構(gòu)造函數(shù),為創(chuàng)建的對象分配堆空間。
16.類成員函數(shù)的重載、覆蓋和隱藏區(qū)別?
??? 答案:
??? a.成員函數(shù)被重載的特征:
??? (1)相同的范圍(在同一個類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual 關(guān)鍵字可有可無。
??? b.覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
??? (1)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual 關(guān)鍵字。
??? c.“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:
??? (1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
??? (2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual 關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)
17.《C++程序設(shè)計教程》P352
在例子中并沒有聲明派生類GraduateStudent的構(gòu)造函數(shù),根據(jù)類的實現(xiàn)機制,派生類對象創(chuàng)建時,將執(zhí)行其默認(rèn)的構(gòu)造函數(shù)。該默認(rèn)構(gòu)造函數(shù)會先調(diào)用基類的默認(rèn)構(gòu)造函數(shù),而基類沒有默認(rèn)構(gòu)造函數(shù),但正好匹配默認(rèn)參數(shù)的構(gòu)造函數(shù)。
18.在運行時,能根據(jù)其類型確認(rèn)調(diào)用哪個函數(shù)的能力,稱為多態(tài)性,或稱遲后聯(lián)編,或滯后聯(lián)編。編譯時就能確定哪個重載函數(shù)被調(diào)用的,稱為先期聯(lián)編。

多態(tài)性可可以簡單的概括為“一個借口,多種方法”,在程序運行的過程中才決定調(diào)用的函數(shù)。虛函數(shù)就是允許被其子類重新定義的成員函數(shù)。而子類重新定義父類虛函數(shù)的做法,稱為“覆蓋”或“重寫”。覆蓋是指子類重新定義父類的虛函數(shù)的做法。重載是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同。

為了指明某個成員函數(shù)具有多態(tài)性,用關(guān)鍵字virtual來標(biāo)志其為虛函數(shù)。
如果虛函數(shù)在基類與子類中出現(xiàn)的僅僅是名字的相同,而參數(shù)類型不同,或返回類型不同,即使寫上了virtual關(guān)鍵字,則也不進(jìn)行遲后聯(lián)編。
19.一個類中將所有的成員函數(shù)都盡可能地設(shè)置為虛函數(shù)總是有益的。它除了會增加一些資源開銷,沒有其它壞處。
設(shè)置虛函數(shù),需注意下列事項:
只有類的成員函數(shù)才能說明為虛函數(shù)。這是因為虛函數(shù)僅適用于有繼承關(guān)系的類對象,所以普通函數(shù)不能說明為虛函數(shù)。
靜態(tài)成員函數(shù)不能是虛函數(shù),因為靜態(tài)成員函數(shù)不受限于某個對象。
內(nèi)聯(lián)函數(shù)不能是虛函數(shù),因為內(nèi)聯(lián)函數(shù)是不能在運行中動態(tài)確定其位置的。即使虛函數(shù)在類的內(nèi)部定義,編譯時,仍將其看作非內(nèi)聯(lián)的。
構(gòu)造函數(shù)不能是虛函數(shù),因為構(gòu)造時,對象還是一片未定型的空間。只有在構(gòu)造完成后,對象才能成為一個類的名副其實的實例。
析構(gòu)函數(shù)可以是虛函數(shù),而且通常聲明為虛函數(shù)。