String類的構造函數、拷貝構造函數、賦值函數和析構函數
原形:
class String
{
public:
String(const char *str = NULL); // 普通構造函數
String(const String &other); // 拷貝構造函數
~ String(void); // 析構函數
String & operate =(const String &other); // 賦值函數
private:
char *m_data; // 用於保存字符串
};
//普通構造函數
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標誌'/0'的空
//加分點:對m_data加NULL 判斷
*m_data = '/0';
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判斷則更好
strcpy(m_data, str);
}
}
// String的析構函數
String::~String(void)
{
delete [] m_data; // 或delete m_data;
}
//拷貝構造函數
String::String(const String &other) // 得分點:輸入參數爲const型
{
int length = strlen(other.m_data);
m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
strcpy(m_data, other.m_data);
}
//賦值函數
String & String::operate =(const String &other) // 得分點:輸入參數爲const型
{
if(this == &other) //得分點:檢查自賦值
return *this;
delete [] m_data; //得分點:釋放原有的內存資源
int length = strlen( other.m_data );
m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
strcpy( m_data, other.m_data );
return *this; //得分點:返回本對象的引用
}
剖析:
能夠準確無誤地編寫出String類的構造函數、拷貝構造函數、賦值函數和析構函數
的面試者至少已經具備了C++基本功的60%以上!
在這個類中包括了指針類成員變量m_data,當類中包括指針類成員變量時,一定要
重載其拷貝構造函數、賦值函數和析構函數,這既是對C++程序員的基本要求,也是《E
ffective C++》中特別強調的條款。
仔細學習這個類,特別注意加註釋的得分點和加分點的意義,這樣就具備了60%以上
的C++基本功!
試題8:請說出static和const關鍵字儘可能多的作用
解答:
static關鍵字至少有下列n個作用:
(1)函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存
只被分配一次,因此其值在下次調用時仍維持上次的值;
(2)在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它
函數訪問;
(3)在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範
圍被限制在聲明它的模塊內;
(4)在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而
只能訪問類的static成員變量。
const關鍵字至少有下列n個作用:
(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常
需要對它進行初始化,因爲以後就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身爲const,也可以指定指針所指的數據爲cons
t,或二者同時指定爲const;
(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內
部不能改變其值;
(4)對於類的成員函數,若指定其爲const類型,則表明其是一個常函數,不能修
改類的成員變量;
(5)對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值
不爲“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編
譯出錯:
classA a, b, c;
(a * b) = c; // 對a*b的結果賦值
操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。
剖析:
驚訝嗎?小小的static和const居然有這麼多功能,我們能回答幾個?如果只能回答
1~2個,那還真得閉關再好好修煉修煉。
這個題可以考查面試者對程序設計知識的掌握程度是初級、中級還是比較深入,沒
有一定的知識廣度和深度,不可能對這個問題給出全面的解答。大多數人只能回答出st
atic和const關鍵字的部分功能。ss
class String
{
public:
String(const char *str = NULL); // 普通構造函數
String(const String &other); // 拷貝構造函數
~ String(void); // 析構函數
String & operate =(const String &other); // 賦值函數
private:
char *m_data; // 用於保存字符串
};
//普通構造函數
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標誌'/0'的空
//加分點:對m_data加NULL 判斷
*m_data = '/0';
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判斷則更好
strcpy(m_data, str);
}
}
// String的析構函數
String::~String(void)
{
delete [] m_data; // 或delete m_data;
}
//拷貝構造函數
String::String(const String &other) // 得分點:輸入參數爲const型
{
int length = strlen(other.m_data);
m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
strcpy(m_data, other.m_data);
}
//賦值函數
String & String::operate =(const String &other) // 得分點:輸入參數爲const型
{
if(this == &other) //得分點:檢查自賦值
return *this;
delete [] m_data; //得分點:釋放原有的內存資源
int length = strlen( other.m_data );
m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
strcpy( m_data, other.m_data );
return *this; //得分點:返回本對象的引用
}
剖析:
能夠準確無誤地編寫出String類的構造函數、拷貝構造函數、賦值函數和析構函數
的面試者至少已經具備了C++基本功的60%以上!
在這個類中包括了指針類成員變量m_data,當類中包括指針類成員變量時,一定要
重載其拷貝構造函數、賦值函數和析構函數,這既是對C++程序員的基本要求,也是《E
ffective C++》中特別強調的條款。
仔細學習這個類,特別注意加註釋的得分點和加分點的意義,這樣就具備了60%以上
的C++基本功!
試題8:請說出static和const關鍵字儘可能多的作用
解答:
static關鍵字至少有下列n個作用:
(1)函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存
只被分配一次,因此其值在下次調用時仍維持上次的值;
(2)在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它
函數訪問;
(3)在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範
圍被限制在聲明它的模塊內;
(4)在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而
只能訪問類的static成員變量。
const關鍵字至少有下列n個作用:
(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常
需要對它進行初始化,因爲以後就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身爲const,也可以指定指針所指的數據爲cons
t,或二者同時指定爲const;
(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內
部不能改變其值;
(4)對於類的成員函數,若指定其爲const類型,則表明其是一個常函數,不能修
改類的成員變量;
(5)對於類的成員函數,有時候必須指定其返回值爲const類型,以使得其返回值
不爲“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編
譯出錯:
classA a, b, c;
(a * b) = c; // 對a*b的結果賦值
操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。
剖析:
驚訝嗎?小小的static和const居然有這麼多功能,我們能回答幾個?如果只能回答
1~2個,那還真得閉關再好好修煉修煉。
這個題可以考查面試者對程序設計知識的掌握程度是初級、中級還是比較深入,沒
有一定的知識廣度和深度,不可能對這個問題給出全面的解答。大多數人只能回答出st
atic和const關鍵字的部分功能。ss
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.