C++面试题(二)——自己实现一个String类
tanglu
实现一个自己的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_;
- }
一举两得,也不用担心有异常发生了。
- 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';
- }
FROM: http://blog.youkuaiyun.com/worldwindjp/article/details/12967443