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类的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

  8. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

随机推荐

  1. ipcm

    用来删除一个或更多的消息队ipcm列.信号量集或者共享内存标识

  2. let

    let a=2+2 #+ - * / % ** 都支持 支持类C的计算方式 let i++ let i-- let i+=10 let i-=10 let i*=10 let i/=10 let i% ...

  3. gerrit配置跳过审核直接push到gitlab

    项目中有存放项目相关的文档,这些项目需要配置跳过审核再提交的操作.现在需要给某些组配置不审核直接提交的权限 方法: 使用管理员账号,到 projects -> access 页面下配置 refe ...

  4. Android中如何引入已经存在的标题栏

    在写程序中很多时候很多页面的标题布局大致都是一样的,这时候不需要挨着都写一遍,只需要写一个xml文件,在所需要的时候进行引用就可以了 只需要这一行代码: <include layout=&quo ...

  5. 各种系统性能优化技术,采用vilocity实现商品页面静态化

    1.大型门户网站系统:>10万的访问量   行业网站(当当网,卓越网):20万-30万,一个小时内会跟数据库的交互至少20万-30万,会产生数据库瓶颈,每个数据库都有一个最大连接数(socket ...

  6. CTF SQL注入

    目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...

  7. fastJson反序列化参数为null的问题

    fastJson反序列化为类对象时,反序列化赋值的属性只会是你构造器上写的属性. 所以部分属性值为null的原因是属性没有加在构造器上的原因. 直接加个无参数的默认构造器即可解决.或者把null属性加 ...

  8. 测量MySQL的表达式和函数的速度

    测量MySQL的表达式和函数的速度,可以调用benchmark()函数.语法格式是benchmark(loop_count,expr).运行的返回值是0,但是mysql会打印一行显示语句大概要执行多长 ...

  9. auto-sklearn

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  10. sklearn逻辑回归(Logistic Regression,LR)调参指南

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...