这一篇是C++的一些面试点的总结。
1、一个String类的完整实现必须很快速写出来(注意:赋值构造,operator=是关键)
如果对C++String不熟悉的话,先看http://www.cplusplus.com/reference/去了解一下String类常用的方法,如果想了解C语言的实现,去看一下《C语言接口与实现》(十五章 低级字符串)。
Scott Meyers在《effecive STL》中提到了std::string有多种实现方式。
总结起来有三类(代码来源《Linux多线程服务端编程》):
1. 无特殊处理,使用类似std::vector的数据结构。start到end之间存储数据,start到end_of_storage之间是容量大小,这样能减少扩容时数据复制的概率。后面两个成员变量还可以使用整数代替,如果字符串大小有限,可以使用u32等来表示end和end_of_storage,减小对象的大小。
class string{
public:
iterator begin() { return start; }
iterator end() { return end; }
private:
char* start;
char* end;
char* end_of_storage;
};
2. Copy-on-Write。对象里只放一个指针。
class string{
struct Rep{
size_t size;
size_t capacity;
size_t refcount;
char* data[1];
};
char* start;
};
3.短字符优化,利用字符串对象本身的空间存储短字符串,通常阈值是15字节。当定义比较短的字符串对象时,不需要再次申请分配内存。
class string{
char* start;
size_t size;
static const int kLocalSize = 15;
union{
char buffer[kLocalSize+1];
size_t capacity;
}data;
};
这里给出关键的赋值函数
/*
如下为CMyString的声明,请为该类型添加赋值运算符
*/
#include<iostream>
#include<string.h>
class CMyString{
public:
CMyString(char *m_pData=NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator=(const CMyString& rhs);
private:
char * m_pData;
};
/*
考察几个知识点:
1.返回值类型为 X& 解决连续赋值时的左值问题
2.使用const &提高效率,避免传参数时的拷贝构造
3.在赋值和拷贝构造函数中,应该先释放原对象空间,重新申请,
避免两个指针指向同一内存,浅拷贝问题,避免内存泄漏。
4.可以使用swap的写法,先构造局部变量,在作用域之外释放掉。
5.字符串申请空间时。应该+1,为结束符'\0'留位置。
6.strcpy应该使用更安全的strncpy代替,避免缓冲区溢出。
*/
CMyString& CMyString::