很多公司在招聘初级或中级C++程序员时,喜欢让面试者手写String类的定义及实现。重点是考察类 String 的构造函数、析构函数和赋值函数以便考察面试者的C++基本功,这里提供一个版本供大家参考!
class myString
{
public:
myString(){
cout<< “default constructor “ <<endl;
m_data = new char[1];
*m_data = ‘\0’;
}
~myString(){
cout << "destroy" << endl;
if(m_data)
{
delete [] m_data;
m_data = NULL;
}
}
myString(const char * str) {
cout<< "paramter construct " <<endl;
if(str == NULL )
{
m_data = new char[1];
*m_data = '\0';
}
else{
m_data = new char[strlen(str)+1];
strcpy(m_data, str );
}
}
myString(const myString& other) {
cout<< "copy construct " <<endl;
value = other.value;
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data, other.m_data );
}
myString & operator =(const myString & other){
cout<< "operator == " <<endl;
if( this != &other ) // 检查自赋值
{
myString strtemp(other);
char * pTemp = strtemp.m_data;
strtemp.m_data = m_data;
m_data = pTemp;
}
// 返回本对象的引用
return *this;
}
char * c_str(){ return m_data; }
private:
char * m_data;
};
考察重点三,考虑异常及安全 如果在赋值函数内部使用delete释放实例自身内存,再用new申请新的内存, 如果此时内存不足导致new操作失败,抛出异常导致类实例状态无效 本文采用零时对象和自身实例交换, 通过局部零时对象离开作用域时调用析构函数 进而释放内存 // 调用演示 int main ( ) { myString aa; myString bb( " mysting bb" ); aa = bb; cout<< aa.c_str() <<endl; return 0 ; }