網(wǎng)訊筆試歸來(lái)
昨天去網(wǎng)訊(杭州)筆試了,做了下筆試題,感覺(jué)題目都不難,但是自己做的的確不怎么樣,估計(jì)是沒(méi)機(jī)會(huì)去了,不過(guò)暫時(shí)還是先把幾道自己還記得的題目,寫出來(lái),總結(jié)下,以做復(fù)習(xí)。
1、 要求自己實(shí)現(xiàn) String 類,給出了 String 類的以下頭文件類聲明
class String
{
public:
String(const char *m_char = NULL);
String(const String & Str);
String& operator = (const String &Str);
~String();
private:
char * m_Data;
};
關(guān)于 String 類的筆試題,以前看林銳的隨筆時(shí)聽(tīng)說(shuō)他在微軟面試時(shí)曾碰到那么一道題目,我自己也沒(méi)有真的下筆去做過(guò),平常都是拿來(lái)就用的,這次自己碰到,才知道會(huì)死得那么慘,反正編得不堪入目(我就不拿出來(lái)獻(xiàn)丑了),下面是我回來(lái)后,自己重新寫的答案。
String::String(const char* m_char)
{
int m_nLength = strlen(m_char) + 1;
if (m_Data != NULL)
{
delete [] m_Data;
m_Data = NULL;
}// 以上判斷是否必要 ??
m_Data = new char[m_nLength];
memcpy(m_Data, m_char, m_nLength);
}
String::String(const String &Str)
{
int m_nLength = strlen(Str.m_Data) + 1;// 以前真的不知道,原來(lái)對(duì)象的私有變量
// 在類的實(shí)現(xiàn)代碼中也是可以訪問(wèn)的
if (m_Data != NULL)
{
delete [] m_Data;
m_Data = NULL;
}// 以上判斷是否必要 ??
m_Data = new char[m_nLength];
memcpy(m_Data, Str.m_Data, m_nLength);
}
String& String::operator = (const String& Str)
{
if(this == &Str)
return *this;
int m_nLength = strlen(Str.m_Data) + 1;
if (m_Data != NULL)
{
delete [] m_Data;
m_Data = NULL;
}// 以上判斷是否必要 ??
m_Data = new char[m_nLength];
memcpy(m_Data, Str.m_Data, m_nLength);
return *this;
}
String::~String()
{
if (m_Data != NULL)
{
delete [] m_Data;
m_Data = NULL;
}
}
2、 關(guān)于內(nèi)存分配
這個(gè)題目很簡(jiǎn)單,就給了一個(gè)函數(shù),然后問(wèn)函數(shù)內(nèi)的局部變量存放在哪里,我也不知道為什么當(dāng)時(shí)會(huì)選擇 heap( 堆 ) ,下面再把幾個(gè)概念羅列出來(lái):
1. 堆區(qū)( heap ):由程序員申請(qǐng)分配和釋放,屬動(dòng)態(tài)內(nèi)存分配方式,若程序員不釋放,程序結(jié)束時(shí)可能會(huì)由 OS 回收。不過(guò)這個(gè)內(nèi)存分配很容易引起問(wèn)題,如果申請(qǐng)的內(nèi)存不釋放就會(huì)造成內(nèi)存泄漏;如果釋放的不是所要釋放的內(nèi)存,則輕者引起程序運(yùn)行結(jié)果出錯(cuò),重者系統(tǒng)崩潰。
2. 棧區(qū)( stack ):編譯器自動(dòng)分配釋放,存放函數(shù)的形參值、局部變量的值,也是屬于動(dòng)態(tài)內(nèi)存分配方式,它由系統(tǒng)分配,所以執(zhí)行效率也高,不過(guò)自由度小,聲明時(shí)就得決定其具體大小。
3. 全局區(qū)(靜態(tài)區(qū))( static ):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,而且初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放,所以也不會(huì)造成內(nèi)存問(wèn)題。
除了以上的變量外,還有兩類存放位置,文字常量區(qū)和程序代碼區(qū),兩者都是由系統(tǒng)分配和釋放,且文字常量區(qū)和前面三區(qū)合成為程序數(shù)據(jù)區(qū),與程序代碼區(qū)相對(duì)應(yīng)。
3、 關(guān)于類繼承的構(gòu)造和析構(gòu)函數(shù)
class Base
{
public:
Base(){cout<< "Base" <<endl;};
~Base(){cout<<"~Base"<<endl;};
protected:
private:
};
class First:public Base
{
public:
First(){cout << "First" << endl;};
~First(){cout << "~First" <<endl;};
};
int main()
{
Base *a = new First;
delete a;
}
問(wèn)程序的輸出會(huì)是什么?
結(jié)果很簡(jiǎn)單,也就是 Base
First
~Base
其它還有一個(gè)關(guān)于 & 的題目,把我搞的云里霧里的,還要再看些東西才知道怎么來(lái)解釋。