最近一直在看剑指offer,这上面的题目都是比较考察编程能力的,打算做个记录,把写过的代码保存下来:
1.实现一个string类
面试官的考察点应该在以下几点:
1.模板类的书写
2.对于赋值函数考察的几点:(1)是否返回引用,因为只有返回引用,才能连续的进行赋值 (2)参数是否是常量 (3)是否是自身赋值(4)是否释放原来的内存
一个完善的 string类如下:
- #include <iostream>
- #include <cstring>
- using namespace std;
- class String
- {
- public:
- String(const char *s = NULL);
- String(const String &rhs);
- String &operator=(const String &rhs);
- ~String();
- friend ostream& operator<<(ostream &os, String&str);
- private:
- char *m_data;
- };
- String::String(const char *str)
- {
- if(str == NULL)
- m_data = NULL;
- else
- {
- int len = strlen(str);
- m_data = new char [len+1];
- strcpy(m_data, str);
- }
- }
- String::String(const String &rhs)
- {
- if(rhs.m_data == NULL)
- m_data == NULL;
- else
- {
- int len = strlen(rhs.m_data);
- m_data = new char [len+1];
- strcpy(m_data, rhs.m_data);
- }
- }
- String::~String()
- {
- delete[] m_data;
- m_data = NULL;
- }
- String& String::operator=(const String &rhs)
- {
- /*if(&rhs == this)
- return *this;
- else
- {
- delete[] m_data;
- int len = strlen(rhs.m_data);
- m_data = new char [len+1];
- strcpy(m_data, rhs.m_data);
- }
- return *this;*/
- //摘自《剑指offer》
- if(&rhs != this)
- {
- String temp(rhs);
- char *t;
- t = m_data;
- m_data = temp.m_data;
- temp.m_data = t;
- }
- return *this;
- }
- ostream &operator<<(ostream &os, String &str)
- {
- os<<str.m_data;
- return os;
- }
- int main()
- {
- String obj1("12");
- String obj2(obj1);
- String obj3, obj4;
- obj4 = obj3 = obj2;
- cout<<obj1<<endl;
- cout<<obj2<<endl;
- cout<<obj3<<endl;
- cout<<obj4<<endl;
- return 0;
- }
对于赋值操作符,如果我们在delete之后,new失败了怎么办,这不是异常安全的,所以<<剑指offer>>中给了我