網訊筆試歸來
昨天去網訊(杭州)筆試了,做了下筆試題,感覺題目都不難,但是自己做的的確不怎么樣,估計是沒機會去了,不過暫時還是先把幾道自己還記得的題目,寫出來,總結下,以做復習。
1、 要求自己實現 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;
};
關于 String 類的筆試題,以前看林銳的隨筆時聽說他在微軟面試時曾碰到那么一道題目,我自己也沒有真的下筆去做過,平常都是拿來就用的,這次自己碰到,才知道會死得那么慘,反正編得不堪入目(我就不拿出來獻丑了),下面是我回來后,自己重新寫的答案。
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;// 以前真的不知道,原來對象的私有變量
// 在類的實現代碼中也是可以訪問的
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、 關于內存分配
這個題目很簡單,就給了一個函數,然后問函數內的局部變量存放在哪里,我也不知道為什么當時會選擇 heap( 堆 ) ,下面再把幾個概念羅列出來:
1. 堆區( heap ):由程序員申請分配和釋放,屬動態內存分配方式,若程序員不釋放,程序結束時可能會由 OS 回收。不過這個內存分配很容易引起問題,如果申請的內存不釋放就會造成內存泄漏;如果釋放的不是所要釋放的內存,則輕者引起程序運行結果出錯,重者系統崩潰。
2. 棧區( stack ):編譯器自動分配釋放,存放函數的形參值、局部變量的值,也是屬于動態內存分配方式,它由系統分配,所以執行效率也高,不過自由度小,聲明時就得決定其具體大小。
3. 全局區(靜態區)( static ):全局變量和靜態變量的存儲是放在一塊的,而且初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統釋放,所以也不會造成內存問題。
除了以上的變量外,還有兩類存放位置,文字常量區和程序代碼區,兩者都是由系統分配和釋放,且文字常量區和前面三區合成為程序數據區,與程序代碼區相對應。
3、 關于類繼承的構造和析構函數
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;
}
問程序的輸出會是什么?
結果很簡單,也就是 Base
First
~Base
其它還有一個關于 & 的題目,把我搞的云里霧里的,還要再看些東西才知道怎么來解釋。