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

https://blog.csdn.net/worldwindjp/article/details/12967443

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

tanglu

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

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

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

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

 
  1. class String {

  2. public:

  3. String();

  4. String(const char *);

  5. //旧写法:

  6. //String(const String& rhs);

  7. //String& operator=(const String& rhs);

  8. //新写法:

  9. String(String rhs);

  10. String& operator=(String rhs);

  11. ~String();

  12. private:

  13. char* data_;

  14. }


其次,老版本的拷贝构造函数和重载赋值操作符时:有几点需要注意的是:判断自己赋值给自己 和 异常安全性。
通过使用swap可以简化方法。
下面是老版本的拷贝构造函数的实现,new的时候有可能会抛出异常。

 
  1. String::String(const String& rhs) {

  2. if (&rhs!=this) {

  3. delete [] data_;

  4. data_ = new char[rhs.size() + 1];

  5. memcpy(data_, rhs.c_str(), rhs.size());

  6. }

  7. return *this;

  8. }

  9.  
  10. String::~String() {

  11. delete [] data_;

  12. }

//使用swap的拷贝构造函数,通过swap将临时变量rhs中的数据保存到了data_中,同时data_中的数据拷贝到了临时变量中,在函数返回时会被自动释放。
一举两得,也不用担心有异常发生了。

 
  1. String::String(String rhs) {

  2. std::swap(data_, rhs.data_);

  3. }

  4.  
  5. String::String& operator=(String rhs) {

  6. std::swap(data_, rhs.data_);

  7. return *this;

  8. }

  9.  
  10. String::String() : data_ = new char[1]{

  11. *data_ = '\0';

  12. }

猜你喜欢

转载自blog.csdn.net/u010029439/article/details/88603377