【C++札记】实现C++的string类
C++有了string类使得操作字符串变得很方便。有关string类,面试过程中也经常问到的就是自己实现一个sring类。下边实现个String类供大家参考:
String.h
#pragma once
class String
{
public:
	//构造函数
	String(const char* str = nullptr);
	//拷贝构造函数
	String(const String & another);
	//析构函数
	~String();
	//获得长度
	int size();
	//转换成char*
	char* c_str();
	//运算符重载=
	String& operator=(const String &str);
	//运算符重载+
	String operator+(const String &str) const;
	//运算符重载==
	bool operator==(const String &str);
	//运算符重载
	char& operator[](int index);
private:
	char* _str;
	int   len;
};
String.cpp
#include "String.h"
#include <string.h>
//构造函数
String::String(const char* str)
{
	if (str)
	{
		len = strlen(str);
		_str = new char[len + 1];
		strcpy_s(_str, len + 1, str);
	}
	else
	{
		len = 0;
		_str = new char[1]{ 0 };
	}
}
//拷贝构造函数
String::String(const String & another)
{
	_str = new char[another.len + 1];
	strcpy_s(_str, another.len + 1, another._str);
	len = another.len;
}
//析构函数
String::~String()
{
	if (_str)
	{
		delete[] _str;
		_str = NULL;
	}
}
//获取长度
int String::size()
{
	return len;
}
//转换成char*
char* String::c_str()
{
	return _str;
}
//运算符重载=
String& String::operator=(const String &str)
{
	if (this == &str)
	{
		return *this;
	}
	delete[] _str;
	_str = new char[str.len + 1]{ 0 };
	strcpy_s(_str, str.len + 1, str._str);
	return *this;
}
//运算符重载+
String String::operator+(const String &str) const
{
	String newString;
	newString.len = len + str.len;
	newString._str = new char[newString.len + 1];
	strcpy(newString._str, _str);
	strcat(newString._str, str._str);
	return newString;
}
//运算符重载==
bool String::operator==(const String &str)
{
	if (strcmp(_str, str._str) == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//运算符重载[]
char& String::operator[](int index)
{
	if (index < len)
	{
		return _str[index];
	}
	else
	{
		return _str[len - 1];
	}
}测试:
int main()
{
	String str1("wangpengfei"); //有参构造函数测试
	String str2(str1);			//拷贝构造函数测试
	String str3 = "wanghongyan";
	String str4 = " wangchouhou";
	String str5 = str3 + str4;	//重载运算符+测试
	cout << str3[0] << endl;	//重载运算符[]测试
	String str6 = "wanghongyan";
	if (str6 == str3)			//重载运算符==测试
	{
		cout << "str3 str6相等" << endl;
	}
	cout << str3.size() << endl;//成员函数size()测试
	cout << str3.c_str() << endl;//成员函数c_str()测试
	getchar();
}
【C++札记】实现C++的string类的更多相关文章
- 标准库String类
		下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ... 
- 自己实现简单的string类
		1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ... 
- C++ string类的实现
		c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ... 
- String类的功能
		String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ... 
- java基础复习:final,static,以及String类
		2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ... 
- String类和StringBuffer类的区别
		首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ... 
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
		Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ... 
- 标准C++中的string类的用法总结
		标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ... 
- String类常用方法
		1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ... 
随机推荐
- OLED液晶屏幕(3)串口读取文字并分割
			https://blog.csdn.net/iracer/article/details/50334041 String comdata = ""; void setup() { ... 
- 【转载】Visual Studio(VS) F12 查看DLL源代码
			https://www.cnblogs.com/zhaoqingqing/p/6751757.html esharper官网:https://www.jetbrains.com/resharper/ ... 
- 80: bzoj3705 线段树合并
			$des$ 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列).可以任意交换每个非叶子节点的左右孩子.要求进行一系列交换,使得 ... 
- 51 NOD 1239 欧拉函数之和(杜教筛)
			1239 欧拉函数之和 基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究 ... 
- ARC063F すぬけ君の塗り絵 2 / Snuke's Coloring 2
			题面 一句话题面:给你一些点,求这些点之中夹的最大的矩形周长.(考虑边界) Solution 首先是一个结论,答案矩形一定经过\(x=\frac{w}{2}\)或经过\(y=\frac{h}{2}\) ... 
- hadoop大作业
			1.数据准备 2.把CSV添加到/bigdatacase/dataset中 3.检查前5行并删除第一行 4.将csv文件导入hadoop并检查前10行数据情况 5.数据文件导入hive 6.在Hive ... 
- vue 创建监听,和销毁监听(addEventListener, removeEventListener)
			最近在做一个有关监听scroll的功能, 发现我添加监听之后一直不起作用: 1 2 mounted() { window.addEventListener("scroll" ... 
- JAVA从服务器下载文件根据Url把多文件打包成ZIP下载
			注意: 1. String filename = new String(“xx.zip”.getBytes(“UTF-8”), “ISO8859-1”);包装zip文件名不发生乱码. 2.一定要注意 ... 
- koa2 get post api restful前端联调
			1.git https://github.com/MengFangui/koa2-restful-api 2.示例代码 //引入 Koa 服务器 const koa = require('koa'); ... 
- Charles  激活入口以及账号密码
			激活入口 // Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用. Registered ... 
