<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

C/C++ 經典面試題(一)之??几拍睢境掷m更新】

【題目1】引用和指針有什么區別?

【解答】

(1)定義一個指針變量編譯器會為它分配內存,而引用不占用任何內存;

(2)引用必須在定義時被初始化,指針不必;

(3)不存在指向空值的引用,但存在指向空值的指針。

【題目2】函數參數傳遞中值傳遞、地址傳遞、引用傳遞有什么區別?

【解答】

(1) 值傳遞,會為形參重新分配內存空間,將實參的值拷貝給形參,形參的值不會影響實參的值,函數調用結束后形參被釋放;

(2) 引用傳遞,不會為形參重新分配內存空間,形參只是實參的別名,形參的改變會影響實參的值,函數調用結束后形參不會被釋放;

(3) 地址傳遞,形參為指針變量,將實參的地址傳遞給函數,可以在函數中改變實參的值,調用時為形參指針變量分配內存,結束時釋放指針變量。

【題目3】static關鍵字有什么作用?

【解答】

(1)函數體內static變量的作用范圍為該函數體,不同于auto變量,該變量的內存只被分配一次,因此其值在下次調用時維持上次的值;

(2)在模塊內的static全局變量可以被模塊內所用函數調用,但不能被模塊外其他函數訪問;

(3)在模塊內的static函數只能被這一模塊內的其他函數調用,這個函數的使用范圍被限制在聲明它的模塊內;

(4)在類中的static成員變量屬于整個類擁有,對類的對象只有一份拷貝;

(5)在類中的static成員函數屬于整個類擁有,這個函數不接收this指針,因而只能訪問static成員變量。

【題目4】const關鍵字有什么作用?

【解答】

(1)阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它初始化,因為以后就沒機會改變它了;

(2)對指針來說,可以指定指針本身為const,也可指定指針所指的數據為const,或二者同時指定為const;

(3) 在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4) 對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;

(5) 對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為左值。

【題目5】鏈表和數組的區別在哪里?

【解答】

(1) 鏈表和數組都可以叫線性表,數組又叫順序表,主要區別在于,順序表是在內存中開辟一段連續的空間來存儲數據,而鏈表是靠指針來連接多塊不連續的空間,在邏輯上形成一片連續的空間來存儲數據;

(2) 數組要求空間連續,占用總空間小,鏈表不要求空間連續,占用總空間大;

(3) 數組方便排序和查找,但刪除和插入較慢;鏈表方便刪除和插入,但查找較慢,不方便排序。

【題目6】請編寫能直接實現strlen()函數功能的代碼

【解答】

int strlen(char*str)
{
?? ?int i = 0;
?? ?for (; str[i] != '\0'; i++);
?? ?return i;
}

【題目7】請編寫能直接實現strstr()函數功能的代碼

【解答】

char *strstr(const? char *str1, const char *str2)
{
????if (NULL == str1 || NULL == str2)
????{
????????return NULL;
????}
????char *dest = (char *)str1;
????char *src = (char *)str2;
????char *flag = NULL;
????while (*dest) // 當*dest不是'\0'時,進入循環
????{
????????flag = dest;
????????src = (char *)str2;
????????while (*flag && *src && (*flag == *src))
????????{
????????????flag++;
????????????src++;
????????}
????????if (!*src) // 當*src='\0',可以判定str2是str1的子串
????????{
????????????return dest;
????????}
????????else
????????{
????????????dest++;
????????}
????}
}

【題目8】進程和線程的差別

【解答】線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:

(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位;

(2)并發性:不僅進程之間可以并發執行,同一個進程的多個線程也可以并發執行;

(3)擁有資源:進程是擁有資源的一個獨立單元,線程不擁有系統資源但可以訪問隸屬于進程的資源;

(4)系統開銷:在創建或撤銷進程時,由于系統都要為之分配和回收資源,導致系統的開銷明顯大于創建或撤銷線程時的開銷。

【題目9】const char * const p是什么意思?

【解答】

(1)char * constp;//常量指針,p的地址不可以修改

(2)char const*p;//指向常量的指針,指向的內容不可以改

(3)const char*p;//同char const *p

(4)const char *const p;//內容和地址都不可以改變

【題目10】memset、memcpy和strcpy的根本區別

【解答】

(1)memset用來對一段內存空間內全部設置為某個字符,一般用在對定義的字符串進行初始化為指定值;

(2)memcpy用來做內存拷貝,可以用來拷貝任何數據類型的對象,可以指定拷貝的數據長度;

(3)strcpy只能拷貝字符串,遇到’\0’就結束拷貝。

【題目11】析構函數有哪些特點?

【解答】

(1)析構函數也是特殊的類成員函數,它沒有返回類型;

(2)沒有參數;

(3)沒有重載;

(4)public、private、protected等權限控制對析構函數無效;

(5)析構函數不能手動調用,只是在類對象生命周期結束的時候,由系統自動調用釋放在構造函數中分配的資源。

【題目12】虛函數有什么作用?

【解答】

(1)虛函數的功能是使子類可以用同名的函數對父類函數進行覆蓋,并且在通過父類指針調用時,如果有覆蓋則自動調用子類覆蓋函數,如果沒有覆蓋則調用父類中的函數,從而實現靈活擴展和多態性;

(2)如果是純虛函數,則純粹是為了在子類覆蓋時有個統一的命名而已,子類必須覆蓋純虛函數,則否子類也是抽象類;

(3)含有純虛函數的類稱為抽象類,不能實例化對象,主要用作接口類。

【題目13】虛析構函數有什么作用?

【解答】

(1)析構函數的工作方式是:最底層的派生類的析構函數最先被調用,然后調用每一個基類的析構函數;

(2)在C++中,當一個派生類對象通過使用一個基類指針刪除,而這個基類有一個非虛的析構函數,則可能導致運行時派生類不能被銷毀。然而基類部分很有可能已經被銷毀,這就導致“部分析構”現象,造成內存泄漏;

(3)給基類一個虛析構函數,刪除一個派生類對象的時候就將銷毀整個對象,包括父類和全部的派生類部分。

【題目14】分別給出bool、int、float、指針變量與零值比較的if語句

【解答】

(1)bool型變量:if(!var)

(2)int型變量:if(var==0)

(3)float型變量:

const float EPSINON=0.000001;

if((x>=- EPSINON)&&(x<= EPSINON))

(4)指針變量:if(var==NULL)

【題目15】以下為Windows NT下32位C++程序,請計算sizeof的值

(1) void Func(charstr[100])

{

?????? sizeof(str)=?

}

(2) void *p=malloc(100);

sizeof(p)=?

(3) int a[100];

sizeof(a)=?

(4)char *p=”aaaaaaa”;

sizeof(p)=?

【解答】

(1) 4

(2) 4

(3) 400

(4) 4

【題目16】寫一個函數返回1+2+3+…+n的值

【解答】

int Sum(int n)

{

?????? return ((long)1+n)*n/2;//或return (1+n)*n/2;

}

【題目17】深度遍歷二叉樹

【解答】

(1)深度優先搜索算法:沿著樹的深度遍歷樹的節點,盡可能深地搜索樹的分支;

(2)廣度優先搜索算法:又叫寬度優先搜索,或橫向優先搜索,是從根節點開始,沿著樹的寬度遍歷樹的節點,如果所有節點均被訪問則算法停止。

struct Node

{

?????? Node *Parent;

?????? Node *Left,*Right;

}

voidThrough(Node *Root)

{

?????? if(Root) printf(Root->data);

?????? if(Root->Left!=null)Through(Root->Left);//左

?????? if(Root->Right!=null)Through(Root-> Right);//右

}

【題目18】C++中的inline內聯函數與普通函數的區別

【解答】

(1)所謂“內聯函數”就是將很簡單的函數內嵌到調用它的程序代碼中,這樣做的目的是節約原本函數調用時的時空開銷,但作為內聯函數,函數體必須十分簡單,不能含有循環、條件、選擇等復雜的結構;

(2)內聯函數和宏的區別在于,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候內聯函數像宏一樣展開,所以取消了函數的參數壓棧,減少了調用的開銷??梢韵裾{用函數一樣調用內聯函數,而不必擔心會產生處理宏的一些問題。

(3)可以用inline來定義內聯函數,不過,任何在類的說明部分定義的函數都會被自動的認為是內聯函數。內聯函數必須是和函數體聲明在一起才有效。

【題目19】C++重寫、重載、重定義的區別?

【解答】

(1)成員函數重載特征:

a.相同的范圍,在同一個類

b.函數名字相同

c.參數不同

(2)重寫(覆蓋)是指派生類函數覆蓋基類函數,特征是:

a.不同的范圍,分別位于基類和派生類中

b.函數的名字相同

c.參數相同

d.基類函數必須有virtual關鍵字

(3)重定義(隱藏)是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

a.如果派生類的函數和基類的函數同名,但是參數不同,此時不管有無virtual,基類的函數被隱藏;

b.如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual關鍵字,此時基類函數被隱藏。

【題目20】一個數據成員是否可以既是const又是static,如果不行,為什么?

【解答】

(1)一個數據成員可以既是const又是static,表示為靜態常量;

(2)常量一般在構造函數后初始化;

(3)靜態成員一般在類外初始化;

(4)靜態常量在類外初始化,但要在類外初始化的同時聲明為const。

【題目21】構造函數與析構函數的異同點

【解答】

1.構造函數有如下特點:

(1)構造函數的名字必須與類名相同;

(2)構造函數可以有任意類型的參數,但不能有返回類型;

(3)定義對象時,編譯系統會自動調用構造函數;

(4)構造函數是特殊的成員函數,函數體可以在類體內也可以在類體外;

(5)構造函數被聲明為公有函數,但它不能像其他成員函數那樣被顯式調用,它是在定義對象的同時被調用的。

2.析構函數有如下特點:

(1)析構函數的名字必須與類名相同,但它前面必須加一個波浪號;

(2)析構函數沒有參數,也沒有返回值,而且不能被重載,因此在一個類中只能有一個析構函數;

(3)當撤銷對象時,編譯系統會自動調用析構函數;

(4)析構函數可以是virtual,而構造函數不能是虛函數。

【題目22】自動調用復制構造函數的幾種情形

【解答】

1.復制構造函數的功能是用一個已知對象來初始化另一個同類的對象。復制構造函數其實也是類的構造函數,與類名相同,有且只有一個參數,是該類對象的引用;每個類必須有一個復制構造函數。如果定義類的時候沒有編寫,編譯器編譯時會自動生成一個復制構造函數。

2.復制構造函數在三種情況下會自動被調用:

(1)當類的一個對象去初始化該類的另一個對象時;

(2)如果函數的形參是類的對象,調用函數進行形參和實參結合時;

(3)如果函數的返回值是類對象,函數調用完成返回時。

【題目23】類型轉換構造函數是什么?舉個例子。

【解答】

類型轉換構造函數就是自動調用類型匹配的構造函數,自動將基本數據類型轉換成對象。例子如下:

#include<iostream>

using namespacestd;

class Person{

public:

? ? ?double height;

? ? ?Person(double h){height=h;}

};

void main()

{

?????? Person yaoming=2.3;

?????? cout<<yaoming.height<<endl;

}

【題目24】簡述C++異常處理方式

【解答】

一個典型的C++異常處理包含以下幾個步驟:

(1)程序執行時發生錯誤;

(2)以一個異常對象(最簡單是一個整數)記錄錯誤的原因及相關信息;

(3)程序監測到這個錯誤(讀取異常對象);

(4)程序決定如何處理錯誤;

(5)進行錯誤處理,并在此后恢復/終止程序的執行。

【題目25】成員函數和友元函數的區別

【解答】

(1)成員函數是類定義的一部分,通過特定的對象來調用。成員函數既可以隱式訪問調用對象的成員,而無須使用成員操作符;

(2)友元函數不是類的組成部分,因此被稱為直接函數調用。友元函數不能隱式訪問類成員,而必須將成員操作符用于作為參數傳遞的對象。

【題目26】C++中哪些運算符不可以重載?

【解答】

不能重載的5個運算符:

(1) .

(2) ?:

(3) sizeof

(4) ::

(5) *

【題目27】如何重載前++和后++運算符?

【解答】

前++不帶參數,后++帶一個int型參數以示區分。

iCount &operator ++()//前綴++

{

?????? cout<<”前綴++”<<endl;

?????? m_data++;

?????? return *this;

}

iCount &operator ++(int)//后置++

{

?????? cout<<”前綴++”<<endl;

?????? iCount temp=*this;

?????? m_data++;

?????? return temp;

}

【題目28】請說出STL標準模板庫中的幾個常用類?

【解答】

數據結構

描述

實現頭文件

向量(vector)

連續存儲的元素

<vector>

列表(list)

由節點組成的雙向鏈表

<list>

集合(set)

由節點組成的集合

<set>

棧(stack)

后進先出的值的排列

<stack>

隊列(queue)

先進先出的值的排列

<queue>

映射(map)

由{鍵,值}對組成的集合

<map>

【題目29】函數模板與函數重載的異同?

【解答】

(1)函數的重載是指定義了幾個名字相同,但參數的類型或參數的個數不同的函數;

(2)模板函數是指的幾個函數的具體算法相同,而參數類型不同的函數;

(3)模板函數可以減少重載函數,但也可能引發錯誤。

【題目30】類型轉換構造函數是什么?

【解答】

類型轉換構造函數就是自動調用類型匹配的構造函數,自動將基本數據類型轉換成對象。

【題目31】C++中explicit關鍵字有什么作用?

【解答】

explicit和構造函數一起使用,explicit指明構造函數只能顯式使用,目的是為了防止不必要的隱式調用類型轉換構造函數。

#include<iostream>

using namespacestd;

class Person{

?????? int height;

public:

?????? Person(){}???

explicit Person(int h)// explicit修飾構造函數

{

?????? height=h;

}

void display()

{

?????? cout<<height<<endl;

}

};

void main()

{

//Person yaoming=2.3;//構造函數用explici修飾后將不能隱式調用類型轉換構

//造函數?????

Person yaoming2(5);//可以顯式調用類型構造函數

}

【題目32】C++中restrict關鍵字有什么作用?

【解答】

(1)restrict是用來優化的;

(2)restrict只能修飾指針,restrict修飾的指針是能夠訪問所指區域的唯一入口,限制多個指針指向同一地址。

【題目33】C++中常用的設計模式有哪些?

【解答】共有23種設計模式,但真正在開發中常用的模式有:

(1)Factory Method(工廠模式);

(2)Strategy(策略模式);

(3)Singleton(單例模式);

(4)Iterator(迭代器模式);

(5)Abstract Factory(抽象工廠模式);

(6)Builder(建造者模式);

(7)Adapter(適配器模式);

(8)Bridge(橋接模式);

(9)Composite(組合模式);

(10)Interpreter(解釋器模式);

(11)Command(命令模式);

(12)Mediator(中介者模式);

(13)Observer(觀察者模式);

(14)State(狀態模式);

(15)Proxy(代理模式)。

【題目34】編寫一個單例模式的例子

【解答】單例模式:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。該實例被所有程序模塊共享。

#include<iostream>

using namespacestd;

classCSingleton

{

private:

?????? CSingleton(){}//構造函數是私有的

?????? static CSingleton *m_pInstance;// static

public:

?????? static CSingleton *GetInstance()//static

?????? {

?????? if(m_pInstance==NULL)//判斷是否第一次調用

????????????? m_pInstance=newCSingleton();

?????? return m_pInstance;

}

};

CSingleton * CSingleton::m_pInstance=NULL;//static屬性類外初始化

void main()

{

?????? CSingleton *p1= CSingleton:: GetInstance();

?????? CSingleton *p2= CSingleton:: GetInstance();

?????? cout<<(p1==p2)<<endl;//結果為true表示單例

}

【題目35】面向對象的三大特征是什么?

【解答】面向對象的三個基本特征:封裝、繼承、多態。

【題目36】什么是封裝?

【解答】

(1)封裝是面向對象的特征之一,是對象和類概念的主要特性;

(2)封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏;

(3)在C++中類中成員的屬性有:public、protected、private,這三個屬性的訪問權限依次降低。

【題目37】什么是繼承?

【解答】

(1)繼承是指:可以使用現有類的所有功能,并在無須重新編寫原來的類的情況下對這些功能進行擴展;

(2)通過繼承創建的類稱為“子類”或“派生類”;

(3)被繼承的類稱為“基類”、“父類”或“超類”;

(4)在某些OOP語言中,一個子類可以繼承多個基類,但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現;

(5)C++中可以用public、protected、private來修飾繼承特性。

【題目38】什么是多態?

【解答】

(1)多態性:允許將父類對象設置為和一個或更多的它的子對象相等的技術,賦值之后,父對象可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單地說,允許將子類類型的指針賦值給父類型的指針;

(2)實現多態的兩種方式:覆蓋、重載;

(3)覆蓋:子類重新定義父類的虛函數;

(4)重載:允許存在多個同名函數,而這些函數的參數表不同。

【題目39】類與對象的區別?

【解答】

類與對象的區別,如人類與張三的區別,它們是一般與個體、抽象與具體、集體與個體的區別。

【題目40】C++中namespace是什么?

【解答】

namespace命名空間,是C++的語言特性,類似于Java中的包。

【題目41】什么是可重入和不可重入函數?

【解答】

(1)什么是可重入性?

可重入函數可以由多個任務并發使用,而不必擔心數據錯誤。相反,不可重入函數不能由多個任務共享,除非能確保函數的互斥??芍厝牒瘮悼梢栽谌我鈺r刻被中斷,稍后繼續運行,不會丟失數據,可重入函數要么使用本地變量,要么使用全局變量時保護自己的數據。

(2)可重入函數

不可連續的調用持有靜態數據;

不返回指向靜態數據的指針,所有數據都是由函數的調用者提供;

使用本地數據,或者通過制作全局數據的本地拷貝來保護全局數據;

如果必須訪問全局變量,記住利用互斥信號量來保護全局變量;

絕不調用任何不可重入函數。

(3)不可重入函數

函數中使用了靜態變量,無論是全局靜態變量還是局部靜態變量;

函數返回靜態變量;

函數中調用了不可重入函數;

函數體內使用了靜態的數據結構;

函數體內調用了malloc()或者free()函數;

函數體內調用了其他標準I/O函數;

總之,如果一個函數在重入條件下使用了未受保護的共享資源,那么就是不可重入的。

【題目42】簡述TCP三次握手與四次揮手,為什么連接的時候是三次握手,關閉的時候卻是四次握手?

【解答】

(1)TCP三次握手

第一次握手:建立連接時,客戶端發送syn包(syn=x)到服務器,并進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。

(2)TCP四次揮手

1)客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。?
2)服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。
3)客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。
4)服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。
5)客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。
6)服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。

(3)連接的時候是三次握手,關閉的時候卻是四次握手的原因

因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

【題目43】簡述Socket通信基本步驟

【解答】具體分成兩個部分:

(1)服務端
1)socket(創建socket)?
2)bind(綁定socket和端口號)?
3)listen(監聽該端口號)
4)accept(等待并接受客戶端連接請求)
5)read,write(讀取數據和返回數據)?
6)close(關閉socket)

(2)客戶端
1)socket(創建socket)?
2)connect(連接指定的端口)?
3)read,write(讀取數據和返回數據)?
4)close(關閉socket)

【題目44】C++中的空類,默認會產生哪些類成員函數

class Empty
{
? public:
? ? Empty(); // 缺省構造函數
? ? Empty( const Empty& ); // 拷貝構造函數
? ? ~Empty(); // 析構函數
? ? Empty& operator=( const Empty& ); // 賦值運算符
? ? Empty* operator&(); // 取址運算符
? ? const Empty* operator&() const; // 取址運算符 const
};

默認構造函數?
析構函數?
拷貝構造函數?
賦值運算符(operator=)?
取址運算符(operator&)(一對,一個非const的,一個const的)

【題目45】定義宏MAX和MIN

#define max(a,b)? ((a) > (b) ? (a) : (b))
#define min(a,b)? ?((a) < (b) ? (a) : (b))

【注意】定義中每個變量都必須加括號

?

【注】如果你覺得此文不錯,可以考慮打賞我哦,您的打賞將是我更新的最大動力,非常感謝。(打賞也是基于自愿原則的哦(* ̄︶ ̄))? ? ? ?

?

已標記關鍵詞 清除標記
1.static有什么用途?(請至少說明兩種) 1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。 2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。 3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用 2.引用與指針有什么區別? 1) 引用必須被初始化,指針不必。 2) 引用初始化以后不能被改變,指針可以改變所指的對象。 3) 不存在指向空值的引用,但是存在指向空值的指針。 3.描述實時系統的基本特性 在特定時間內完成特定的任務,實時性與可靠性。 4.全局變量和局部變量在內存中是否有區別?如果有,是什么區別? 全局變量儲存在靜態數據庫,局部變量在堆棧。 5.什么是平衡二叉樹? 左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大于1。 6.堆棧溢出一般是由什么原因導致的? 沒有回收垃圾資源。 7.什么函數不能聲明為虛函數? constructor函數不能聲明為虛函數。 8.冒泡排序算法的時間復雜度是什么? 時間復雜度是O(n^2)。 9.寫出float x 與“零值”比較的if語句。 if(x>0.000001&&x<-0.000001) 10.Internet采用哪種網絡協議?該協議的主要層次結構? Tcp/Ip協議 主要層次結構為: 應用層/傳輸層/網絡層/數據鏈路層/物理層。 11.Internet物理地址和IP地址轉換采用什么協議? ARP (Address Resolution Protocol)(地址解析協議) 12.IP地址的編碼分為哪倆部分? IP地址由兩部分組成,網絡號和主機號。不過是要和“子網掩碼”按位與上之后才能區分哪些是網絡位哪些是主機位。 13.用戶輸入M,N值,從1至N開始順序循環數數,每數到M輸出該數值,直至全部輸出。寫出C程序。 循環鏈表,用取余操作做 14.不能做switch()的參數類型是: switch的參數不能為實型。 1.寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值(3分) int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ? 答:C錯誤,左側不是一個有效變量,不能賦值,可改為(++a) += a; 改后答案依次為9,10,10,11 2.某32位系統下, C++程序,請計算sizeof 的值(5分). char str[] = “http://www.ibegroup.com/” char *p = str ; int n = 10; 請計算 sizeof (str ) = ?(1) sizeof ( p ) = ?(2) sizeof ( n ) = ?(3) void Foo ( char str[100]){ 請計算 sizeof( str ) = ?(4) } void *p = malloc( 100 ); 請計算 sizeof ( p ) = ?(5) 答:(1)17 (2)4 (3) 4 (4)4 (5)4 3. 回答下面的問題. (4分) (1).頭文件中的 ifndef/define/endif 干什么用?預處理 答:防止頭文件被重復引用 (2). #i nclude 和 #i nclude “filename.h” 有什么區別? 答:前者用來包含開發環境提供的庫頭文件,后者用來包含自己編寫的頭文件。 (3).在C++ 程序中調用被 C 編譯器編譯后的函數,為什么要加 extern “C”聲明? 答:函數和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern "C"修飾的變 量和函數是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調 用C 函數。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。 (4). switch()中不允許的數據類型是? 答:實型 4. 回答下面的問題(6分) (1).Void GetMemory(char **p, int num){ *p = (char *)malloc(num); } void Test(void){ char *str = NULL; GetMemory(&str, 100); strcpy(str, "he
相關推薦
??2020 CSDN 皮膚主題: 大白 設計師:CSDN官方博客 返回首頁
彩票送彩金