【笔试面试题】编写一个简易的String类

作者: veaxen 分类: 笔试面试 发布时间: 2017-07-22 19:50

这里主要是考察我对类编写的熟悉程度,编写类一些注意要点,比如String类需要注意构造函数、析构函数和赋值函数等。下面代码展示了一个简易的Strin类的编写:

class String{
public:
    String(const char *str = NULL);         //普通构造函数
    String(const String &str);          //拷贝构造函数
    ~String();                          //析构函数
    String & operator=(const String &str);//赋值函数
private:
    char *sptr;
};

String::String(const char *str)
{
    if(str != NULL){
        sptr = new char[strlen(str)+1];
        strcpy(sptr,str.sptr);
    }else{//这里我们把NULL处理为空字符串""
        sptr = new char;
        *sptr = '\0';
    }
}

String::String(const String &str)
{
    pstr = new char[strlen(str.pstr)+1];
    strcpy(pstr,str.pstr);
}

String::~String()
{
    if(pstr != NULL){
        delete [] pstr;
        pstr = NULL;
    }
}

String & String::operator=(const String &str)
{
    if(this != &str){
        delete [] pstr;
        pstr = new[strlen(str.pstr)+1];
        strcpy(pstr,str.pstr);
    }
    return *this;
}

这里展示了一个简易的String类的编写,其中构造函数需要注意的要点是要写上普通构造函数和拷贝构造函数,这里我分析一下。

首先是对于普通构造函数:String(const char *str = NULL);
这里,我们写默认str为NULL,那么当我们要生成一个对象时,不给构造参数时,默认就是调用这个构造函数,不填构造参数事,相当于str为NULL,当然也可以不这么定义构造函数,上面的普通函数构造函数的声明等同于声明下面两个构造函数的效果:

String();
String(const char *str);

对于拷贝构造函数和析构函数,应该没什么好分析的,那么就分析下赋值函数,我们要注意一个对象赋值给自己的情况,也就是this == &str时。当然,上面的赋值函数的编写没有考虑new分配失败抛出时导致的数据丢失,当new申请内存失败时,会throw出异常,此时已经delete掉pstr指向的内存了,而又内存申请又失败,导致原先的数据丢失了。当然,这对于初级程序员的写法应该没问题,但是如果高级程序员应该采用下面的代码:

String & String::operator=(const String &str)
{
    if(this != &str){
        char *tmp = new char[strlen(str.pstr)+1];
        strcpy(tmp,str.pstr);
        delete [] pstr;
        pstr = tmp;
    }
    return *this;
}

当new失败时,就会抛出异常,后面的delete代码也不会执行到,原来数据就不会丢失!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据