String 类的拷贝构造函数, 赋值操作符重载, 算数操作符重载

一般来讲 赋值,下标,调用 和成员放文件头必须定义为成员函数,否则在编译时会出现错误 复合复制操作符通常也应该定义为类的成员(当然不这么做不会出现编译错误)改变对象状态的自增 自减 解引用 应该定义为类成员,对象操作符 (如 算数运算符(返回一个对象,一般不返回引用,与内置操作符的返回类型想匹配),相等操作符,关系操作符,位操作符 最好定义为普通非成员函数)
下面为String类的拷贝构造函数,赋值操作符重载的代码:
#include <iostream>
#include <cstring>
using namespace std;
class String
{
public:
	String(const char *str = NULL);
	String(const String & other);
	String & operator =  (const String & other);//返回引用是为了减少开销,否则就得调用拷贝构造函数
	friend String  operator + (const String &, const String & other);// 这里不能返回引用,如果返回引用将报错,
//因为此时函数体里面的temp 临时变量会被释放
	//friend String  operator - (const String &, const String & other);
	friend bool operator < (const String &, const String & other);
	friend bool operator > (const String &, const String & other);
	friend bool  operator == (const String &, const String & other);
	friend ostream & operator << (ostream &, const String &);
	//friend ostream & operator << (ostream &,  String &); // 会改变string 因此不能是const
	//必须为友元函数,因为输入输出操作符不能成为其他类的成员函数,而且这个函数需要访问string类的私有成员

	~String();
	char  *show ()
	{
		return data;
	}
private:
	char *data;
};

String::String(const char *str)
{
	if(str == NULL)
	{
		data = new char[1];
		data = '\0';
	}
	else
	{
		int len = strlen(str);
		data = new char[len+1];
		strcpy(data, str);
	}
}

String::String(const String & other)
{
	int len = strlen(other.data);
	data = new char[len+1];
	strcpy(data, other.data);
}

String & String::operator = (const String & other)
{
	if(this == &other)
		return *this;
	delete [] data;
	int len = strlen(other.data);
	data = new char[len+1];
	strcpy(data, other.data);
	return *this;
}

String operator + (const String & first , const String & other)
{
	String temp;
	temp.data = new char[strlen(first.data)+ strlen(other.data) + 1];
	if(temp.data != NULL)
	strcpy(temp.data, first.data);
	strcat(temp.data, other.data);
	return temp;
}

bool operator < (const String & first, const String & other)
{
	if(strcmp(first.data, other.data) < 0)
		return true;
	return false;
}

bool operator > (const String & first, const String & other )
{
	if(strcmp(first.data, other.data) > 0)
		return true;
	return false;
}

bool operator == (const String & first, const String & other )
{
	if(strcmp(first.data, other.data) == 0)
		return true;
	return false;
}

ostream & operator << (ostream & output, const String & other)
	// ostream 不能为const 因为对IO对象的读写会改变他的状态,引用必须是非const的
{
	output << other.data;
	return output;
}

String::~String()
{
	delete [] data;
}

int main()
{
	char *p = "abc";
	cout << strlen(p) << endl;
	String s(p);
	cout << "s:" <<s<<endl;
	String s1 = s;
	cout << "s1:" << s1<<endl;
	cout << "s+s1 = " << s+s1 << endl;
	String s2;
	s2 = s;
	cout <<"s2:"<< s2.show() << endl;
	String s3("xyz");
	cout << "s3: "<<s3 <<" s>s3: "<<(s>s3)<<" s==s3: "<<(s == s3) <<" s<s3: " <<(s<s3)<<endl;
	return 0;
}




相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页