- 深拷贝实现string类
#define _CRT_SECURE_NO_WARNING 1
#include<iostream>
#include<string>
using namespace std;
class String
{
public:
friend ostream&operator << (ostream &os, String &str);
friend String operator+(const String &str1, const String &str2); //双目运算符重载为友元函数
String() //默认构造函数
:_size(0)
{
_str = new char[1];
*_str = '\0';
}
char *my_strcpy(char *dest, const char *src)
{
char *tmp = dest;
while (*src)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return tmp;
}
int my_strlen(const char *str1)
{
int count = 0;
while (*str1)
{
count++;
str1++;
}
return count;
}
String(char *str="") //构造函数
:_str(new char[my_strlen(str) + 1])
, _size(my_strlen(str))
{
my_strcpy(_str, str);
}
~String() //析构函数
{
delete[] _str;
}
String(const String &str) //拷贝构造
{
_size = str._size;
_str = new char[my_strlen(str._str) + 1];
my_strcpy(_str, str._str);
}
String &operator=(String &str) //赋值
{
if (this != &str)
{
if (_size < str._size)
{
delete[] _str;
_str = new char[my_strlen(str._str) + 1];
}
_size = str._size;
my_strcpy(_str, str._str);
}
return *this;
}
int my_strcmp(const char *str1, const char *str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return false;
}
str1++;
str2++;
}
return *str1 - *str2;
}
//比较操作符
bool operator==(const String &str)
{
if (my_strcmp(_str, str._str) == 1)
{
return true;
}
return false;
}
bool operator!=(const String &str)
{
return !(_str == str._str);
}
bool operator>(const String &str)
{
if (my_strcmp(_str, str._str) > 0)
{
return true;
}
return false;
}
bool operator<(const String &str)
{
if (my_strcmp(_str, str._str) <0)
{
return true;
}
return false;
}
bool operator>=(const String &str)
{
return ((_str>str._str) || (_str == str._str));
}
bool operator<=(const String &str)
{
return ((_str < str._str) || (_str == str._str));
}
char & operator[](int index) //下标操作符
{
if (index >= 0 && index < _size)
return _str[index];
}
String insert(int pos, char ch) //在pos后插入字符
{
char *_old = _str;
_size = _size + 1;
_str = new char[_size + 1];
for (int i = 0; i < pos; i++)
{
*(_str + i) = *(_old + i);
}
for (int i = pos; i < pos + 1; i++)
{
*(_str+i) = ch;
}
for (int i = pos + 1; i < _size; i++)
{
*(_str + i) = *(_old + i - 1);
}
*(_str + _size) = '\0';
delete _old;
return *this;
}
private:
char *_str;
int _size;
};
String operator+(const String &str1,const String &str2)
{
String tmp("");
tmp._size = str1._size + str2._size;
tmp._str = new char[tmp._size + 1];
strcpy(tmp._str, str1._str);
strcat(tmp._str, str2._str);
return tmp;
}
ostream& operator << (ostream &os, String &str)
{
os << str._str << endl;
return os;
}
int main()
{
String str1("");
String str2("abc");
String str3(str2);
String str4("a.b.c.");
String str5("");
str1=str4;
str3.insert(2, 'a');
str5 = str2 + str3;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
cout << str4 << endl;
cout << str5 << endl;
system("pause");
return 0;
}
#include<iostream>
using namespace std;
class String
{
public:
friend ostream& operator << (ostream &os, String &str);
char* my_strcpy(char *dest, char *src)
{
char *tmp = dest;
while (*src!='\0')
{
*dest++ = *src++;
}
*dest = '\0';
return tmp;
}
String(char *str = "") //构造函数
:_str(new char[strlen(str)+5])
{
*(int *)_str = 1; //计数器
_str += 4;
my_strcpy(_str, str);
}
~String() //析构
{
if (_str != NULL)
{
if (--(*(int *)(_str-4))==0)
{
delete[] (_str-4);
}
}
}
String(String const &str)
{
_str = str._str;
++(*(int *)(_str-4));
}
String operator=(const String &str)
{
if (this != &str) //自赋值
{
if (--(*(int *)(_str - 4)) == 0)
{
delete[](_str - 4);
}
_str = str._str;
++(*(int *)(_str - 4));
}
return *this;
}
char &operator[](int n)
{
return _str[n];
}
private:
char *_str;
};
ostream& operator << (ostream &os, String &str)
{
os << str._str << endl;
return os;
}
int main()
{
String str1("what ");
String str2(str1);
cout << str2[2] << endl;
String str3 = str1;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
system("pause");
return 0;
}
-