题目:实现一个MyString类,类的声明如下
//MyString函数的实现 class MyString{ public: MyString(char *pData = NULL); MyString(const MyString &string); MyString& operator=(const MyString &string); ~MyString(); private: char *m_dada; };
实现如下
//实现构造函数 MyString::MyString(char *pData){ if(pData == NULL){ return; } else{ int len = strlen(pData); this->m_dada = new char[len+1]; strcpy(this->m_dada, pData); } } //实现拷贝构造函数 MyString::MyString(const MyString &string){ int len = strlen(string.m_dada); this->m_dada = new char[len+1]; strcpy(this->m_dada, string.m_dada); } //实现operator= MyString& MyString::operator=(const MyString &string){ if(this == &string){ //一定要判断是否相等 return *this; } int len = strlen(string.m_dada); delete[] this->m_dada; //释放之前空间的内容 this->m_dada = new char[len+1]; strcpy(this->m_dada, string.m_dada); return *this; //类的成员函数返回类的引用对象是直接返回*this } //实现析构函数 MyString::~MyString(void){ //无参数列表加个void delete[] this->m_dada; this->m_dada = NULL; //防止空指针 }
注意几个问题:
1. 赋值运算符函数的返回值应该是该类型的引用,所以在函数结束之后要返回*this。
一般对于类的成员函数返回值是类的引用的话函数结束直接返回*this
2. 拷贝构造函数的参数必须只能为类型的引用,并且只能是一个参数。如果拷贝构造函数参数不是引用那么将会引起无限递归,调用构造函数内部继续调用构造函数。
3. 赋值运算符函数中参数是不是声明为const类型的引用。如果不声明为引用那么每次在调用函数的时候都会执行一次拷贝构造函数,降低了效率。如果声明为引用类型则可以避免这些无用的消耗,提高代码效率。
注意在赋值运算符函数中,注意一定要判断是否赋值的两个对象是同一个。如果没有判断,则假如两个对象是一样的话delete掉之后会导致对象内存释放,再也无法找到对象的值了。
4. 要及时的释放内存空间,释放完空间之后要把指针指向NULL
5. 参数如果是只读的话,要加上const,防止被意外修改
时间: 2024-11-29 12:18:37