C/C++学习笔记:String类的构造函数、析构函数和赋值函数

已知:String 类 

class String 

public: 
      String(const char *str = NULL); // 通用构造函数
     String(const String &another); // 拷贝构造函数
     ~ String(); // 析构函数
     String& operator=(const String &rhs); // 赋值函数
private: 
     char *m_data; // 用于保存字符串
}; 


#include <iostream>

class String
{
public:
	String (const char *str = NULL); //通用构造函数
	String (const String &another);  //拷贝构造函数
	~String();						  //析构函数
	String& operator = (const String &rhs);	 //赋值函数
protected:
private:
	char *m_data; //用于保存字符串
};

String::String(const char *str)
{
	if ( NULL == str)
	{
		m_data = new char[1];  对空字符串自动申请存放结束标志'\0'的空间
		if ( NULL == m_data )  //内存是否申请成功
		{
			std::cout << "Application of memory failure" << std::endl;
			exit(1);
		}
		m_data[0] = '\0';
	}
	else
	{
		int length = strlen(str);
		m_data = new char[length + 1];
		if (NULL == m_data)
		{
			std::cout << "Application of memory failure" << std::endl;
			exit(1);
		}
		strcpy(m_data, str);
	}
}

String::String(const String &another)  //输入参数为const型 
{
	int length = strlen(another.m_data);
	m_data = new char[length + 1];
	if (NULL == m_data)
	{
		std::cout << "Application of memory failure" << std::endl;
		exit(1);
	}
	strcpy(m_data, another.m_data);
}

//析构函数
String::~String()
{
	delete [] m_data;
}

String& String::operator=(const String &rhs)  //输入参数为const型 
{
	if ( this == &rhs )	 //检查自赋值 
	{				  
		return *this;
	}
	int length = strlen(rhs.m_data);
	delete [] m_data;	//释放原来的内存资源
	m_data = new char[length+1];
	if (NULL == m_data)
	{
		std::cout << "Application of memory failure" << std::endl;
		exit(1);
	}
	strcpy(m_data, rhs.m_data);
	return *this;	  //返回本对象的引用
}



// 测试
void main()
{
	String A;
	String B("CSDN");
	system("pause");
}


引申:用C++实现一个String类,它具有比较,连接,输入,输出功能,并且提供一些测试用例。

//String.h
#ifndef STRING_H
#define STRING_H

#include<iostream>
using namespace std;

class String
{
public:
	String();								//默认构造函数
	String(int n, char c);					 //普通构造函数
	String(const char* source);				 //普通构造函数
	String(const String& s);				 //复制构造函数
	String& operator= (char* s);			  //重载=,实现字符串赋值
	String& operator= (const String& s);	  //重载=,实现对象赋值
	~String();								   //析构函数
	char& operator[] (int i);					//重载[],实现数组运算
	const char& operator[] (int i) const;		//重载[],实现数组运算(对象为常量)
	String& operator+= (const String& s);		 //重载+=,实现与对象相加
	String& operator+= (const char* s);			 //重载+=,实现与字符串相加
	friend ostream& operator<< (ostream& out, String& s);	//重载<<,实现输出流
	friend istream& operator>> (istream& in, String& s);	  //重载>>,实现输入流
	friend bool operator< (const String& left, const String& right);   //重载<
	friend bool operator> (const String& left, const String& right);	//重载>
	friend bool operator== (const String& left, const String& right);	 //重载==
	friend bool operator!= (const String& left, const String& right);	 //重载!=
	char* getData();//获取data指针
	int length();
private:
	int size;	  //长度
	char* data;	   //指向字符串数据
};

#endif

//String.cpp
#include "String.h"

String::String()
{
	data = new char[1];
	*data = '\0';
	size = 0;
}

String::String(int n, char c)
{
	data = new char[n + 1];
	size = n;
	char* tmp = data;
	while( n -- )
	{
		*tmp++ = c;
	}
	*tmp = '\0';
}

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

String::String(const String& s)
{
	data = new char[s.size + 1];
	strcpy(data, s.data);
	size = s.size;
}

String& String::operator=(char* s)
{
	if (NULL != data)
	{
		delete [] data;
	}
	size = strlen(s);
	data = new char[size + 1];
	strcpy(data, s);
	return *this;
}

String& String::operator=(const String& s)
{
	if( this == &s )
	{
		return *this;
	}
	if(NULL != data)
	{
		delete[] data;
	}
	size = strlen(s.data);
	data = new char[size + 1];
	strcpy(data, s.data);
	return *this;
}

String::~String()
{
	if( NULL != data)
	{
		delete[] data;
		data = NULL;
		size = 0;
	}
}

char& String::operator[](int i)
{
	return data[i];
}

const char& String::operator[](int i) const
{
	return data[i];
}

String& String::operator+=(const String& s)
{
	int len = size + s.size +1;
	char* temp = data;
	data = new char[len];
	size = len - 1;
	strcpy(data, temp);
	strcat(data, s.data);
	delete[] temp;
	return *this;
}

String& String::operator+=(const char* s)
{
	if( NULL == s)
	{
		return *this;
	}
	int len = size + strlen(s) + 1;
	char* temp = data;
	data = new char[len];
	size = len - 1;
	strcpy(data, temp);
	strcat(data, s);
	delete[] temp;
	return *this;
}

int String::length()
{
	return size;
}

ostream& operator<<(ostream& out, String& s)
{			
	for( int i = 0; i < s.length(); ++i)
	{
		 out << s[i] << " ";
	}
	return out;
}

istream& operator>>(istream& in, String& s)
{
	char p[50];
	in.getline(p,50);
	s = p;
	return in;
}

bool operator< (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] < 0 ? true:false;
}

bool operator> (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] > 0 ? true:false;
}

bool operator== (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] == 0 ? true:false;
}

bool operator!= (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] != 0 ? true:false;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值