main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?
答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在 main 函數(shù)之前執(zhí)行
static的應(yīng)用和作用
(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值;
(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi);
(4)在類中的static成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;
(5)在類中的static成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收this指針,因而只能訪問類的static成員變量。
const的應(yīng)用和作用
(1)欲阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了;
(2)對(duì)指針來說,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;
(3)在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對(duì)于類的成員函數(shù),若指定其為const類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;
(5)對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型,以使得其返回值不為“左值”。
函數(shù)指針和指針函數(shù)的區(qū)別
函數(shù)指針是指向一個(gè)函數(shù)入口的指針;
指針函數(shù)是函數(shù)的返回值是一個(gè)指針類型。
new/delete 和malloc/free 的區(qū)別
new和delete會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造與析構(gòu)函數(shù)而malloc與free不會(huì);
malloc與free是C++/C 語言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete 是C++的運(yùn)算符
什么是指針 指針的理解
指針是一個(gè)變量,該變量專門存放內(nèi)存地址;
指針變量的類型取決于其指向的數(shù)據(jù)類型,在所指數(shù)據(jù)類型前加*
指針變量的特點(diǎn)是它可以訪問所指向的內(nèi)存。
static函數(shù)與普通函數(shù)的區(qū)別
static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
struct(結(jié)構(gòu))和union(聯(lián)合)的區(qū)別
1. 結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 聯(lián)合中只存放了一個(gè)被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。
2. 對(duì)于聯(lián)合的不同成員賦值, 將會(huì)對(duì)其它成員重寫,? 原來成員的值就不存在了, 而對(duì)于結(jié)構(gòu)的不同成員賦值是互不影響的。
?class和struct的區(qū)別
struct 的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的。
程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于(堆)中
UDP和TCP的區(qū)別
TCP的全稱為傳輸控制協(xié)議。這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。
UDP全稱為用戶報(bào)文協(xié)議,它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。
用TCP還是UDP,那要看你的程序注重哪一個(gè)方面?可靠還是快速?
全局變量的優(yōu)缺點(diǎn)
全局變量也稱為外部變量,它是在函數(shù)外部定義的變量,它屬于一個(gè)源程序文件,它保存上一次被修改后的值,便于數(shù)據(jù)共享,但不方便管理,易引起意想不到的錯(cuò)誤。
數(shù)組與指針的區(qū)別
數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意類型的內(nèi)存塊。
(1)修改內(nèi)容上的區(qū)別
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤
(2) 用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p 為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量。
內(nèi)存的分配方式
分配方式有三種,
1、 靜態(tài)存儲(chǔ)區(qū),是在程序編譯時(shí)就已經(jīng)分配好的,在整個(gè)運(yùn)行期間都存在,如全局變量、常量。
2、 棧上分配,函數(shù)內(nèi)的局部變量就是從這分配的,但分配的內(nèi)存容易有限。
3、 堆上分配,也稱動(dòng)態(tài)分配,如我們用new,malloc分配內(nèi)存,用delete,free來釋放的內(nèi)存。
strcpy()和memcpy()的區(qū)別
strcpy()和memcpy()都可以用來拷貝字符串,strcpy()拷貝以’\0’結(jié)束,但memcpy()必須指定拷貝的長(zhǎng)度。
winsock建立連接的主要實(shí)現(xiàn)步驟
服務(wù)器端:socket()建立套接字,綁定(bind)并監(jiān)聽(listen),用accept()等待客戶端連接, accept()發(fā)現(xiàn)有客戶端連接,建立一個(gè)新的套接字,自身重新開始等待連接。該新產(chǎn)生的套接字使用send()和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。
客戶端:socket()建立套接字,連接(connect)服務(wù)器,連接上后使用send()和recv(),在套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。
構(gòu)成Win32 API函數(shù)的三個(gè)動(dòng)態(tài)鏈接庫(kù)是
內(nèi)核庫(kù),用戶界面管理庫(kù),圖形設(shè)備界面庫(kù)。
Visual C++、Win32 API和MFC之間的關(guān)系
(1)?? Visual C+是一個(gè)以C++程序設(shè)計(jì)語言為基礎(chǔ)的、集成的、可視化的編程環(huán)境;
(2)?? Win32 API是32位Windows操作系以C/C++形式提供的一組應(yīng)用程序接口;
(3)?? MFC是對(duì)Win32 API的封裝,簡(jiǎn)化了開發(fā)過程。
多態(tài)的兩個(gè)必要條件
1.一個(gè)基類的指針或引用指向一個(gè)派生類對(duì)象??
2.虛函數(shù)
什么時(shí)候需要用虛析構(gòu)函數(shù)
當(dāng)基類指針指向用new運(yùn)算符生成的派生類對(duì)象時(shí),delete基類指針時(shí),派生類部分沒有釋放掉而造成釋放不徹底現(xiàn)象,需要虛析構(gòu)函數(shù)。 補(bǔ)充:虛函數(shù)就是讓派生類調(diào)用基類的虛函數(shù)。
語句for(;1;)有什么問題 ?它是什么意思
無限循環(huán),和while(1)相同。
TCP/IP建立連接的過程
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。
第一次握手:建立連接時(shí),客戶端發(fā)送連接請(qǐng)求到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到客戶端連接請(qǐng)求,向客戶端發(fā)送允許連接應(yīng)答,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的允許連接應(yīng)答,向服務(wù)器發(fā)送確認(rèn),客戶端和服務(wù)器進(jìn)入通信狀態(tài),完成三次握手
memset ,memcpy的區(qū)別
memset用來對(duì)一段內(nèi)存空間全部設(shè)置為某個(gè)字符,一般用在對(duì)定義的字符串進(jìn)行初始化為’\0′。
memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對(duì)象,可以指定拷貝的數(shù)據(jù)長(zhǎng)度;
類成員函數(shù)的重載、覆蓋和隱藏的區(qū)別
成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無。
覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual 關(guān)鍵字。
“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual 關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆)
面向?qū)ο蟮娜齻€(gè)基本特征
1. 封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private, protected,public)
2. 繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。前兩種(類繼承)和后一種(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。
3. 多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
下面函數(shù)的返回值(微軟)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:將x轉(zhuǎn)化為2進(jìn)制,看含有的1的個(gè)數(shù)。
strcat能把strSrc的內(nèi)容連接到strDest,為什么還要char *類型的返回值
方便賦值給其他變量
C++中什么數(shù)據(jù)分配在棧或堆中
棧: 存放局部變量,函數(shù)調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理
堆: 程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng),new 和malloc申請(qǐng)的內(nèi)存就在堆上
請(qǐng)說出 const 與 #define 相比,有何優(yōu)點(diǎn)?
答案:
Const作用:定義常量、修飾函數(shù)參數(shù)、修飾函數(shù)返回值三個(gè)作用。被Const修飾的東西都受到強(qiáng)制保護(hù),可以預(yù)防意外的變動(dòng),能提高程序的健壯性。
1 ) const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型 。編譯器可以對(duì)前者進(jìn)行類型 安全檢查 。而對(duì)后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤。
2 ) 有些集成化的調(diào)試工具可以對(duì) const 常量進(jìn)行調(diào)試 ,但是不能對(duì)宏常量進(jìn)行調(diào)試。
http://www.mianwww.com/html/2012/11/17375.html