字符串函数的模拟实现
char * strcpy(char * cpyStr,const char * str){
assert((cpyStr != NULL) && (str != NULL));
char * strFirst = cpyStr;
while(*str != '\0'){
*cpyStr = *str;
cpyStr++;
str++;
}
*cpyStr = *str;
return strFirst;
}
int strlen(const char * str){
assert(str != NULL);
int count = 0;
while(*str != '\0'){
count++;
str++;
}
return count+1;
}
char * Strcat(char * dest,const char * str){
assert((dest!= NULL) && (str != NULL));
char * strFirst = dest;
while(*dest != '\0'){
dest++;
}
while(*str != '\0'){
*dest = *str;
dest++;
str++;
}
*dest = *str;
return strFirst;
}
int Strcmp(const char * dest,const char * str){
assert((dest != NULL) && (str!= NULL));
while(*dest != '\0'&& *str != '\0' && *dest == *str){
dest++;
str++;
}
if(int(*dest) - int(*str) == 0){
return 0;
}else if(int(*dest) - int(*str) > 0){
return 1;
}else{
return -1;
}
}
字符串类的模拟实现
class String{
public:
String():_data(new char[1]){
*_data = '\0';
};
String(const char * str){
if(str == NULL){
_data = new char[1];
*_data = '\0';
}else{
int length = strlen(str);
_data = new char[length+1];
strcpy(_data,str);
}
};
String(const String & str){
int length = strlen(str._data);
_data = new char[length+1];
strcpy(_data,str._data);
}
String(String && str){
_data = str._data;
str._data = NULL;
}
String & operator=(const String & other){
if(this != &other){
delete[] _data;
_data = nullptr;
int length = strlen(other._data);
_data = new char[length+1];
strcpy(_data,other._data);
}
return *this;
}
String & operator=(String && str){
if(this != &str){
delete[] _data;
_data = nullptr;
_data = str._data;
str._data = nullptr;
}
return *this;
}
~String(){};
private:
char * _data;
};
对于一个C++的空类来说,编译器会默认创建8个函数:
- 无参构造函数
- 析构函数
- 重载取地址运算符函数(const)
- 重载取地址运算符函数(非const)
- 拷贝构造函数
- 重载赋值运算符函数
- 移动拷贝构造函数
- 移动赋值运算符函数
移动语义的这几个函数根据C++ Primer的说法,在特定情况下编译器会有默认的实现,也就是没有自定义构造函数、析构函数和拷贝构造函数的时候会自动创建