类string的原型
- <span style="font-size:18px;">class string
- {
- public:
- string(const char* str = NULL);
- string(const string &other);
- ~string(void);
- string & operater = (const string &other);
- private:
- char *m_string;
- };</span>
自己编写String的构造函数、析构函数和赋值函数:
- <span style="font-size:18px;">#include <iostream>
- #include <string.h>
-
- using namespace std;
-
- class String
- {
- public:
- String(const char* str = NULL);
- String(const String &other);
- ~String(void);
- String & operator = (const String &other);
- private:
- char *m_string;
- };
-
- String::~String(void)
- {
- cout<<"Destructing"<<endl;
- if(m_string != NULL)
- {
- delete[] m_string;
- m_string = NULL;
- }
- }
-
- String::String(const char* str)
- {
- cout<<"Constructing"<<endl;
- if(str == NULL)
- {
- m_string = new char[1];
- *m_string = '\0';
- }
- else
- {
- m_string = new char[strlen(str)+1];
- strcpy(m_string, str);
- }
- }
-
- String::String(const String& other)
- {
- cout<<"Constructing Copy"<<endl;
- m_string = new char[strlen(other.m_string)+1];
- strcpy(m_string, other.m_string);
- }
-
- String & String::operator = (const String& other)
- {
- cout<<"operator = Function"<<endl;
- if(this == &other)
- {
- return *this;
- }
- delete[] m_string;
- m_string = new char[strlen(other.m_string)+1];
- strcpy(m_string, other.m_string);
- return *this;
- }
-
- int main()
- {
- String a("hello");
- String b("world");
- String c(a);
- c=b;
-
- return 0;
- }</span>
(1)普通构造函数:判断了传入的参数是否为NULL,如果是NULL,初始化一个字节的空字符串(包括结束符‘\0’);如果不是,分配足够大小长度的堆内存来保存字符串。
(2)复制构造函数:只是分配足够大小的堆内存来保护字符串。
(3)析构函数:如果类私有成员m_string不为NULL,释放m_string指向的堆内存,并且为了避免产生野指针,将m_string赋空。
(4)赋值函数:首先判断当前对象与引用传递对象是否为同一对象,如果是直接返回;否则,先释放当前对象的堆内存,然后分配足够大小的堆内存赋值字符串。
执行结果:
- Constructing
- Constructing
- Constructing Copy
- operator = Function
- Destructing
- Destructing
- Destructing