您的位置:首页 > 编程语言 > C语言/C++

C++面试题(二)——自己实现一个String类

2013-10-23 12:13 531 查看
C++面试题(二)——自己实现一个String类


tanglu

http://blog.csdn.net/worldwindjp/

实现一个自己的String类是一道考验C++基础知识的好题。

至少要能实现以下:构造函数,析构函数,拷贝构造函数(copy constructor),重载赋值操作符(copy assignment operator),。

首先是至少能够准确的写出这几个函数的声明。

class String {
public: 
       String();
       String(const char *);
       //旧写法:
       //String(const String& rhs);
       //String& operator=(const String& rhs);
       //新写法:
       String(String rhs);
       String& operator=(String rhs);
       ~String();
private:
       char* data_;
}


其次,老版本的拷贝构造函数和重载赋值操作符时:有几点需要注意的是:判断自己赋值给自己 和 异常安全性。

通过使用swap可以简化方法。

下面是老版本的拷贝构造函数的实现,new的时候有可能会抛出异常。

String::String(const String& rhs) {
	if (&rhs!=this) {
		delete [] data_;
		data_ = new char[rhs.size() + 1];
		memcpy(data_, rhs.c_str(), rhs.size());
	}
	return *this;
}

String::~String() {
	delete [] data_;
}


//使用swap的拷贝构造函数,通过swap将临时变量rhs中的数据保存到了data_中,同时data_中的数据拷贝到了临时变量中,在函数返回时会被自动释放。

一举两得,也不用担心有异常发生了。
String::String(String rhs) {
      std::swap(data_, rhs.data_);
}

String::String& operator=(String rhs) {
      std::swap(data_, rhs.data_);
      return *this;
}

String::String() : data_ = new char[1]{
        *data_ = '\0';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: