4.深拷貝和淺拷貝
(1)什麼時候會用到拷貝函數
一個對象以值傳遞的方式傳入函數(就是作為入參)
一個對象以值傳遞的方式從函數返回(就是作為返回值)
一個對象需要通過另外一個對象進行初始化
(2)是否應該自定義拷貝函數
如果不自己定義拷貝函數,那麼編譯器會自動生成一個默認的拷貝函數,這個拷貝函數就會完成對象之間的位拷貝
(3)深拷貝和淺拷貝的理解
當一個類擁有資源(比如說指針),這個類的對象發生復制過程的時候資源是否重新分配(指針指向一塊內存,發生拷貝時是否會在重新申請一塊內存),重新分配就是深拷貝,沒有就是淺拷貝,
http://blog.csdn.net/feitianxuxue/article/details/9275979這個大家可以仔細看看加深理解。
5.重寫CString(這個也是基本都會考)
class String
{
public:
String(const char *str = NULL); // 通用構造函數
String(const String &another); // 拷貝構造函數
~String(); // 析構函數
String& operater =(const String &rhs); // 賦值函數
private:
char* m_data; // 用於保存字符串
};
String::String(const char *str = NULL)// 通用構造函數
{
if(NULL==str)
{
m_data = new char[1];
m_data[0] = '\0';
}else
{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String::String(const String &another) // 拷貝構造函數
{
m_data = new char[strlen(anoter.m_data)+1];
strcpy(m_data,another.m_data);
}
String& String::operater =(const String &rhs)// 賦值函數
{
if(&rhs==this)
{
return *this;
}
delete [] m_data;
m_data = NULL;
m_data = new char[strlen(rhs.m_data)+1];
strcpy(m_data,rhs.m_data);
return *this;
}
String:: ~String() // 析構函數
{
delete [] m_data;
m_data = NULL;
}
6.線程的同步問題
線程同步的方法:臨界區,互斥量,信號量,事件。
臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。
互斥量:為協調共同對一個共享資源的單獨訪問而設計的。
信號量:為控制一個具有有限數量用戶資源而設計。
事 件:用來通知線程有一些事件已發生,從而啟動後繼任務的開始。
(1)臨界區和互斥量的區別?
互斥量跟臨界區很相似,只有擁有互斥對象的線程才具有訪問資源的權限,由於互斥對象只有一個,因此就決定了任何情況下此共享資源都不會同時被多個線程所訪問。當前占據資源的線程在任務處理完後應將擁有的互斥對象交出,以便其他線程在獲得後得以訪問資源。互斥量比臨界區復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。