类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

以String类为例实现其成员函数

class String
{
	//友元函数重载运算符
	friend ostream& operator<<(ostream &out,String& str);
	friend istream& operator>>(istream& in, String& str);
public:
	//通用构造函数
	String(const char* str)
	{
		if(!str)	//对m_data加NULL判断
		{
			length = 0;
			m_data = new char[1];	//对空字符串自动申请存放结束标志'\0'的空
			*m_data = '\0';
		}
		else
		{
			length = strlen(str);
			m_data = new char[length + 1];
			strcpy(m_data, str);
		}
	}
	//析构函数
	virtual ~String()
	{
		delete[] m_data;
	}

	//拷贝构造
	String(const String &str)	//输入参数为const型
	{
		length = str.length;
		m_data = new char[length+1];
		strcpy(m_data, str.m_data);
	}

	//赋值构造
	String& operator=(const String &str)	//输入参数为const型
	{
		if (this == &str)	//检查自赋值
			return *this;
		delete[] m_data;
		int length = strlen(str.m_data);
		m_data = new char[length + 1];
		strcpy(m_data, str.m_data);
		return *this;	//返回本对象的引用
	}

	//重载+
	String operator+(const String &str) const
	{
		String newString("");
		newString.length = length + strlen(str.m_data);
		newString.m_data = new char[newString.length + 1];
		strcpy(newString.m_data, m_data);
		strcat(newString.m_data, str.m_data);
		return newString;
	}

	//重载[]
	inline char& operator[](int n)
	{
		if (n > length)
			return m_data[length - 1];
		else
			return m_data[n];
	}

	//重载+=
	String& operator+=(const String& str)
	{
		length += str.length;
		char *newData = new char[length + 1];
		strcpy(newData,m_data);
		strcat(newData, str.m_data);
		delete[] m_data;
		m_data = newData;
		return *this;
	}

	//重载==
	inline bool operator==(const String& str) const
	{
		if (length != str.length)
			return false;
		return strcmp(m_data, str.m_data) ? false : true;
	}

	inline size_t size() const
	{
		return length;
	}

private:
	char* m_data;
	size_t length;
};

//为什么要重载为友元函数?
/*如果是双目运算符,只要设置一个参数作为右侧运算量,左侧运算符就是对象this本身
 *但是>>或<<左侧运算符是cin或cout而不是对象本身,只能声明为友元了
 *如果一定要声明为成员函数,只能声明为ostream & operator<<(ostream &output)
 *在运用这个<<运算符时就变为这种形式了:data<<cout;不合符人的习惯。
 */

ostream& operator<<(ostream& out,String& str)
{
	out << str.m_data;
	return out;
}

istream& operator>>(istream& in,String& str)
{
	char temp[1024];
	in >> temp;
	str.length = strlen(temp);
	str.m_data = new char[str.length + 1];
	strcpy(str.m_data, temp);
	return in;
}
posted @ 2019-08-30 12:41  WindSun  阅读(328)  评论(0编辑  收藏  举报
博客已停更,文章已转移,点击访问