算法与数据结构基础2:String类的实现

废话少说,拒绝前奏,直接高潮,且看代码:

// String.h

#include <iostream>
#include <cstring>

#pragma warning(disable : 4996)

using namespace std;

class String
{
public:
	// **************************************************************************
	// 类的四大函数:构造函数、拷贝构造函数、重载赋值运算符、析构函数
	// **************************************************************************
	String(const char* str = NULL);
	String(const String &str);
	String& operator=(const String &str);
	~String();

	// **************************************************************************
	// 重载
	// **************************************************************************
	String operator+(const String &str) const;
	String& operator+=(const String &str);
	bool operator==(const String &str);
	char& operator[](unsigned int index);

	friend ostream& operator<<(ostream& os, String& str);
	friend istream& operator>>(istream& is, String& str);

	unsigned short size();
	const char* c_str() const;
private:

private:
	char* m_string;
};

// **************************************************************************
// 类的四大函数:构造函数、拷贝构造函数、重载赋值运算符、析构函数
// **************************************************************************
String::String(const char* str)
{
	if (!str){
		m_string = NULL;
	}
	else{
		m_string = new char[strlen(str) + 1];
		strcpy(m_string, str);
	}
}

String::String(const String &str)
{
	if (!str.m_string){
		m_string = NULL;
	}
	else{
		m_string = new char[strlen(str.m_string) + 1];
		strcpy(m_string, str.m_string);
	}
}

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

String::~String()
{
	delete[] m_string;
	m_string = NULL;
}

// **************************************************************************
// 重载
// **************************************************************************
String String::operator+(const String &str) const
{
	String newString;
	if (!str.m_string){
		newString = *this;
	}
	else if(!m_string){
		newString = str;
	}
	else{
		newString.m_string = new char[strlen(m_string) + strlen(str.m_string) + 1];
		strcpy(newString.m_string, m_string);
		strcat(newString.m_string, str.m_string);
	}

	return newString;
}

String& String::operator+=(const String &str)
{
	String newString;
	if (!str.m_string){
		newString = *this;
	}
	else if (!m_string){
		newString = str;
	}
	else{
		newString.m_string = new char[strlen(m_string) + strlen(m_string) + 1];
		strcpy(newString.m_string, m_string);
		strcat(newString.m_string, str.m_string);
	}

	strcpy(m_string, newString.m_string);

	return *this;
}

bool String::operator==(const String &str)
{
	if (strlen(m_string) != strlen(str.m_string)){
		return false;
	}
	return strcmp(m_string, str.m_string) ? false : true;
}

char& String::operator[](unsigned int index)
{
	if (index >=0 && index <=strlen(m_string)){
		return m_string[index];
	}
	else{
		cout << "invalid index:" << index << endl;
		exit(0);
	}
}

ostream& operator<<(ostream& os, String& str)
{
	os << str.m_string;
	return os;
}

istream& operator>>(istream& is, String& str)
{
	char tmp[1024];
	is >> tmp;
	str.m_string = new char[strlen(tmp) + 1];
	strcpy(str.m_string, tmp);
	return is;
}

unsigned short String::size()
{
	return strlen(m_string);
}

const char* String::c_str() const
{
	return m_string;
}

// main.cpp

#include "String.h"
#include <cstdlib>

int main()
{
	String s;
	cin >> s;
	cout << s << ":" << s.size() << endl;

	char a[] = "Hello", b[] = "World";
	String s1(a), s2(b);
	cout << s1 << " + " << s2 << " = " << s1 + s2 << endl;

	String s3 = s1 + s2;
	if (s1 == s3){
		cout << "First: s1 == s3" << endl;
	}

	s1 += s2;
	if (s1 == s3){
		cout << "Second: s1 == s3" << endl;
	}

	system("pause");

	return 0;
}

输出结果:

附:

strcpy在vs2013下报错,解决方案参考:

http://blog.csdn.net/u010273652/article/details/21320431

时间: 2024-10-29 19:07:35

算法与数据结构基础2:String类的实现的相关文章

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

算法与数据结构基础 - 广度优先搜索(BFS)

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

算法与数据结构基础1:动态数组

恶补算法与数据结构,从很基础的开始,先看动态数组的实现. // array.h #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class Array { public: // ************************************************************************** // 类的四大函数:构造函数.拷贝构

Java基础之String类的细节问题

本文转载自http://sarin.iteye.com/blog/603684/ 先来看一个例子,代码如下: Java代码   public class Test { public static void main(String[] args) { String str = "abc"; String str1 = "abc"; String str2 = new String("abc"); System.out.println(str == 

Java基础笔记-String类

String 类(被final修饰) 字符串是一种特殊的对象,一旦字符串被初始化就不可以被改变了.(内容不变) 例如: String  s = “abc”; String  s1 = new String(“abc”); s在内存中有一个对象, s代表的是一个类类型变量,”abc”是一个对象. s1在内存中有两个对象,分别是new出来的和:  “abc” . s == s1;的结果是false.   因为s和s1它们所对应的地址不同,比较的两个地址,s和s1中存储的地址数值是不同的.因此是fal

整理Java基础知识--String类

Java String 类创建字符串最简单的写法:String i = "我是字符串":String 类是不可改变的,一旦创建了String对象,就固定了 String i = "123"; System.out.println("i = " + i); i = "abc"; System.out.println("i = " + i); 输出结果: 123 abc 等价于: String i = new

Java基础之String类、StringBuffer类、StringBuilder类

String类对象有两种实例化方法 直接赋值:只开辟一块对内存空间,可以自动入池. 构造方法:开辟两块[堆]内存空间,不会自动入池,使用intern()方法手动入池. 任何一个字符串都是String类的匿名对象. 字符串一旦声明则不可以改变,可以改变的只是String类对象的引用. String类可以使用 + 进行字符串的连接操作 StringBuffer类的内容可以进行修改,而String类的内容是不可以修改的. 在String类里面,提供了一个与StringBuffer类比较的方法: pub

算法与数据结构基础3:简单单链表List类的实现

简单的单链表实现,数据类型定义成了int,如果要通用,需要改成模板类,然后稍微修改下就可以了. // List.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class List { public: // ************************************************************************** //