实现C++string的赋值函数
2015-11-23 18:30
423 查看
之前一直敲C语言,对C++有点疏忽了,前两天看到《剑指offer》一道关于这个问题解法的面试题,于是动手敲了一下,却发现自己给的解法只是初级解法。总结原因,还是自己没有充分利用C++的特性,只是站在C语言的角度在写C++程序。
首先,分析一下这个问题要求:
1.实现对象赋值(深拷贝);
2.传入对象应该是const的,防止对象的值被修改;
3.应该有返回值,也就是说,要能作为左值;
4.要有异常处理机制(这里使用if,没有使用try catch);
5.还有最后一点,容易被忽略若开始时指针有指向,应该先释放这块空间,否则则会造成内存泄露,还有个细节就是,delete释放空间后,记得将指针的指向置为NULL(毕竟C++不好写,哈哈^-^);
说到这里,我建议你可以试着实现一下以上的要求,可能你会和我一样,会给出课本上的那种所谓的“标准解法”,等你实现之后,你再看看我给出的参考《剑指offer》给出的“高级解法”,你可能会和我一样,感叹它的精妙。下面给出代码实现:
首先,分析一下这个问题要求:
1.实现对象赋值(深拷贝);
2.传入对象应该是const的,防止对象的值被修改;
3.应该有返回值,也就是说,要能作为左值;
4.要有异常处理机制(这里使用if,没有使用try catch);
5.还有最后一点,容易被忽略若开始时指针有指向,应该先释放这块空间,否则则会造成内存泄露,还有个细节就是,delete释放空间后,记得将指针的指向置为NULL(毕竟C++不好写,哈哈^-^);
说到这里,我建议你可以试着实现一下以上的要求,可能你会和我一样,会给出课本上的那种所谓的“标准解法”,等你实现之后,你再看看我给出的参考《剑指offer》给出的“高级解法”,你可能会和我一样,感叹它的精妙。下面给出代码实现:
#include <iostream> #include <new> #include <cstring> #include <cstdlib> using namespace std; class my_string { private: char *str_ptr; public: my_string(); my_string(char *str_ptr); my_string(const my_string &str); my_string &operator = (const my_string &str); void print(); ~my_string(); }; void my_string::print() { cout << str_ptr << endl; } my_string::my_string(char *str_ptr) { if (str_ptr == NULL) { cerr << "argument is error" << endl; } this->str_ptr = new(nothrow)char[strlen(str_ptr) + 1]; if (this->str_ptr == NULL) { cerr << "merrory is full" << endl; exit(1); } strcpy(this->str_ptr, str_ptr); } my_string::my_string(const my_string &str) { if (str.str_ptr) { this->str_ptr = new(nothrow)char[strlen(str.str_ptr) + 1]; if (this->str_ptr == NULL) { cerr << "merrory is full" << endl; exit(1); } strcpy(this->str_ptr, str.str_ptr); } } my_string::~my_string() { delete []str_ptr; this->str_ptr = NULL; } /****************************************************** *********************高级解法************************* *****************************************************/ //使用临时变量的优势: //1.将new的判错交给拷贝构造函数 //2.将this->str_ptr指向的原有单元的释放交给temp的析构函数 //3.从而简化了代码 my_string &my_string::operator = (const my_string &str) { if (&str != this && str.str_ptr != NULL) { my_string temp(str); char *temp_ptr = this->str_ptr; this->str_ptr = temp.str_ptr; temp.str_ptr = temp_ptr; } return *this; } my_string::my_string() { str_ptr = NULL; } int main(int argc, char* argv[]) { char str[100] = {0}; my_string *obj_ptr = NULL; my_string obj1, obj2; cout << "Please input a string:" << endl; cin >> str; obj_ptr = new(nothrow)my_string(str); if (obj_ptr == NULL) { cerr << "memory is full" << endl; exit(1); } obj1 = obj2 = *obj_ptr; obj1.print(); obj2.print(); obj_ptr->print(); delete obj_ptr; obj_ptr = NULL; }注:赋值号重载的实现函数和《剑指offer》有些许细微差别,我觉得我这样写可能代码的健壮性更好一点。
相关文章推荐
- 算法导论上机实验3——用区间树实现简易课程管理系统,包括课程的插入、删除和查找
- C++在循环内和循环外定义变量的差异
- C/C++ pthread 线程库的封装
- C语言进制转换
- c语言之阶乘因式分解
- 查询 C/C++类所属库
- c++ 异常处理(3)
- c++ 异常处理(2)
- c++ 异常处理(1)
- Some Notes of gflags
- C++获取文件大小的几种方法
- C语言的空格问题
- C++中重载、重写(覆盖)和隐藏的区别
- 整数变换问题-----回溯法
- C++将HBITMAP保存为bmp图片
- c++中的一些概念
- BinaryHeap 的C++实现
- BinaryHeap 的C++实现
- BinaryHeap 的C++实现
- BinaryHeap 的C++实现