C++面试题模拟实现String
2017-03-19 21:41
417 查看
C++ 的一个常见面试题是让你实现一个 String 类,通常面试官只会给十五分钟左右,不可能要求具备 std::string 的功能,但至少要求能正确管理资源不存在内存泄漏。具体来说:
需要编写构造函数;拷贝构造函数;析构函数;运算符重载=;
【一】传统写法:该开辟空间,开辟空间;该释放空间,释放空间;
可读性高,符合人的思维;
【二】现代写法:建立一个中间对象tmp,出了这个作用域tmp会自动调用析构函数,代码简洁;
如下图所示对现代写法的tmp进行描述:
需要编写构造函数;拷贝构造函数;析构函数;运算符重载=;
【一】传统写法:该开辟空间,开辟空间;该释放空间,释放空间;
可读性高,符合人的思维;
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<assert.h> using namespace std; class String { public: friend ostream& operator<<(ostream& os, const String& s); String( const char* str = "") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } String(const String& s) :_str(new char[strlen(s._str)+1]) { strcpy(_str, s._str); } String& operator=(const String&s) { if (_str != s._str) { // delete[] _str; //先释放_str,再申请空间如果申请不到, //_str = new char[strlen(s._str)+1]; //还毁坏了原有数据,得不偿失 //strcpy(_str, s._str); char* tmp = new char[strlen(s._str) + 1]; strcpy(tmp, s._str); delete[]_str; _str = tmp; } return *this; } ~String() { if (_str != NULL) { delete[]_str; _str = NULL; } } private: char* _str; }; ostream& operator<<(ostream& os, const String& s) { os << s._str; return os; } int main() { String s1("abcdefg"); String s2(s1); String s3 ; s3 = s2; cout << s2 << endl; cout << s3 << endl; return 0; }
【二】现代写法:建立一个中间对象tmp,出了这个作用域tmp会自动调用析构函数,代码简洁;
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<assert.h> using namespace std; class String { public: friend ostream& operator<<(ostream& os, const String& s); String( const char* str = "") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } String(const String& s) :_str(NULL) { String tmp(s._str); swap(_str, tmp._str); } /*String& operator=(const String& s) { if (this != &s) //这种在函数里边调用 { //拷贝构造函数产生临时变量 String tmp(s);//不如直接采用值传递方便 swap(_str, tmp._str); } return *this; }*/ String& operator=(String s) { swap(_str, s._str); return *this; } ~String() { if (_str != NULL) { delete[]_str; _str = NULL; } } private: char* _str; }; ostream& operator<<(ostream& os, const String& s) { os << s._str; return os; } int main() { String s1("abcdefg"); String s2(s1); String s3 ; s3 = s2; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; return 0; }
如下图所示对现代写法的tmp进行描述:
相关文章推荐
- 【C++】面试题:模拟实现string类(版本一:用深度拷贝来实现 )
- C++中string的模拟实现
- 【C++】模拟string类的实现(string 类的深拷贝)
- c++中string的模拟实现
- C++面试题之模拟实现string类
- C/C++面试题:编程实现快速排序
- C++面试题:介绍一下STL,STL如何实现vector。
- 用c和c++分别实现ASCII String to integers
- c++模拟动态语言中string类的实现
- C++实现CString和string的互相转换
- java string.split()函数的c/c++两种实现——strtok_r及string.find()
- C/C++面试题:编写类String的构造函数、析构函数和赋值函数。
- 程序员面试题精选(48):两个堆栈模拟队列c++代码实现
- 用标准c++实现string与各种类型的转换
- 百度面试题 c++ 实现引用类型与被引用的对象分离的一种方法
- 《The+C+++Programming+Language》第十一章String部分实现
- 面试一道题--C模拟实现C++的多态
- C++实现CString和string的互相转换
- 通过重载类的成员操作符来实现对string 类的模拟
- 离散事件模拟---银行业务模拟c++实现