C++面试题(二)——自己实现一个String类
2013-10-23 12:13
531 查看
C++面试题(二)——自己实现一个String类
tanglu
http://blog.csdn.net/worldwindjp/
实现一个自己的String类是一道考验C++基础知识的好题。
至少要能实现以下:构造函数,析构函数,拷贝构造函数(copy constructor),重载赋值操作符(copy assignment operator),。
首先是至少能够准确的写出这几个函数的声明。
其次,老版本的拷贝构造函数和重载赋值操作符时:有几点需要注意的是:判断自己赋值给自己 和 异常安全性。
通过使用swap可以简化方法。
下面是老版本的拷贝构造函数的实现,new的时候有可能会抛出异常。
//使用swap的拷贝构造函数,通过swap将临时变量rhs中的数据保存到了data_中,同时data_中的数据拷贝到了临时变量中,在函数返回时会被自动释放。
一举两得,也不用担心有异常发生了。
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'; }
相关文章推荐
- 4.C语言之数组
- c++获取字符串长度的方法
- C语言不定参数个数,可变参数函数使用学习
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息
- 折半插入排序法---排序算法(二)
- 2 new improvements of cpputest updated from 3.4 to 3.5
- How to write the better Makefile for cpputest
- C++中.h与.cpp的关系
- C++操作符重载
- opencv 2.4+ c++ svm介绍
- 关于boost 库 shared_ptr 智能指针的循环引用【2013.10.22】
- C++ 11右值引用的理解
- C++入门篇04
- 编写可移植C/C++程序的要点
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- 代码分析工具 cppcheck 使用介绍
- VC++ Delete Directory
- 凯撒(Caesar)密码加密解密c语言
- Visual C++.NET中 字符串转换方法
- 结构体对齐那点事 熟练c/c++(四)