【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 ...
随机推荐
- SQL Server 父子迭代查询语句,树状查询
这个也有用: -- Get childs by parent idWITH TreeAS( SELECT Id,ParentId FROM dbo.Node P WHERE P.Id = 21 -- ...
- Learning Vector Quantization
学习矢量量化. k近邻的缺点是你需要维持整个数据集的训练. 学习矢量量化算法(简称LVQ)是一种人工神经网络算法,它允许你选择要挂在多少个训练实例上,并精确地了解这些实例应该是什么样子. LVQ的表示 ...
- c++ main函数
vs 2015的运行环境 1.参数 int main(int argc, char* argv[]) 1)两个参数的类型是固定的,但参数名可以是符合命名规则的任何命名 2)argv[0]为执行文件的路 ...
- 2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版
https://www.cnblogs.com/yangfengwu/p/11071580.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
- CSS3 之loading动画实现思路
效果大致如下: 主要实现方式: 该效果主要用到animation-timing-function中的steps()函数,该函数主要用于分步隐藏不同模块. 实现思路: 第一步动画: 第二步动画: 第三步 ...
- 洛谷P3205 合唱队
题目 区间dp.但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路. 这个题我们首先发现每个人在插入的时候一定插入到队伍 ...
- python的tecplot模块(tecplot新特性)
Python的tecplot模块仅支持tecplot2017以上 首先安装tecplot2017 安装完成以后,安装python的tecplot模块 可以通过终端转入tecplot安装目录下的pyte ...
- 刷题记录:[De1CTF 2019]SSRF Me
目录 刷题记录:[De1CTF 2019]SSRF Me 一.涉及知识点 1.MD5长度扩展攻击 2.Python 2.x - 2.7.16 urllib.fopen支持local_file导致LFI ...
- #C++初学记录(typedef和define)
typedef的用法 typedef关键字可以用于给数据类型定义一个别名,即可以给long long 定义成ll,也可以给结构体定义,当你定义了一个结构体时,每次创建一个结构体都要使用struct+结 ...
- swoole流程图
程图,便于以后回忆下 总结几点如下: 首先主进程监听pipe_master事件, 子进程监听pipe_worker事件 通过主进程派生的线程 swReactorThread *thread = swS ...