类似于C语言写strcpy函数,C++里面重载赋值操作符也是一个很基本但也很能考察C++编程者编程习惯的小测试。写这个程序的过程会反应出编程者的许多编程习惯和对C++的掌握程度,要想写好它还真不是那么容易。下面的小程序是我自己写的重载操作,经过了一些测试,有问题请大家指出斧正。
// C++FuncOverloading.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
class String
{
public:
String(const char *str = NULL); //普通构造函数
~String(void); //析构函数
String& operator=(const String &other); //赋值函数
void print();//输出
private:
char *m_data; // 用于保存字符串
};
String::String(const char *str)
{
printf("Constructor!\n");
if(str==NULL)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String::~String()
{
delete[] m_data;
m_data = NULL;
printf("destructor\n");
}
String& String::operator=(const String &other) //这里返回的参数或传入参数若不是String类型的引用,会调用类的拷贝构造函数
{
//如果写成了if(*this==other),真该好好反省
if(this == &other) //这里判断是否为对象本身
return *this;
else
{
if(m_data!=NULL)
{
//这里如果不释放原有的内存,将会造成严重的内存泄漏,可以测试一下如果不释放内存然后while(1)循环“=”操作,程序瞬间吃掉计算机所有内存
delete[] m_data;
m_data = NULL;//比较习惯于释放了指针指向的内存资源时,将该指针赋值为空值,以防出现"野指针"的情况
}
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
return *this;
}
}
void String::print()
{
cout << m_data << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
String a("I am a test string");
String b,c;
c=b=a;
b.print();
c.print();
//while(1)
// b=a;
return 0;
}