当前位置: 首页 > news >正文

java string的实现_string类的实现

/*下面逐个进行成员函数的实现。

同样构造函数适用一个字符串数组进行String的初始化,默认的字符串数组为空。这里的函数定义中不需要再定义参数的默认值,因为在类中已经声明过了。

另外,适用C函数strlen的时候需要注意字符串参数是否为空,对空指针调用strlen会引发内存错误。*/String::String(const char *str)//通用构造函数

{if (!str)

{

length= 0;

data= new char[1];*data = '\0';

}else{

length=strlen(str);

data= new char[length + 1];

strcpy(data, str);

}

}//拷贝构造函数需要进行深复制。

String::String(const String &str)//拷贝构造函数

{

length=str.size();

data= new char[length + 1];

strcpy(data, str.c_str());

}//析构函数需要进行内存的释放及长度的归零。

String::~String()//析构函数

{delete[]data;

length= 0;

}//重载字符串连接运算,这个运算会返回一个新的字符串。

String String::operator+(const String &str) const//重载+

{

String newString;

newString.length= length +str.size();

newString.data= new char[newString.length + 1];

strcpy(newString.data, data);

strcat(newString.data, str.data);returnnewString;

}//重载字符串赋值运算,这个运算会改变原有字符串的值,为了避免内存泄露,这里释放了原先申请的内存再重新申请一块适当大小的内存存放新的字符串。

String& String::operator=(const String &str)//重载=

{if (this == &str) return *this;delete[]data;

length=str.length;

data= new char[length + 1];

strcpy(data, str.c_str());return *this;

}//重载字符串+=操作,总体上是以上两个操作的结合。

String& String::operator+=(const String &str)//重载+=

{

length+=str.length;char *newData = new char[length + 1];

strcpy(newData, data);

strcat(newData, str.data);delete[]data;

data=newData;return *this;

}//重载相等关系运算,这里定义为内联函数加快运行速度。

inline bool String::operator==(const String &str) const//重载==

{if (length != str.length) return false;return strcmp(data, str.data) ? false : true;

}//重载字符串索引运算符,进行了一个简单的错误处理,当长度太大时自动读取最后一个字符。

inline char& String::operator[](int n) const//重载[]

{if (n >= length) return data[length-1]; //错误处理

else returndata[n];

}//重载两个读取私有成员的函数,分别读取长度和C字符串。

inline size_t String::size() const//获取长度

{returnlength;

}//重载输入运算符,先申请一块足够大的内存用来存放输入字符串,再进行新字符串的生成。这是一个比较简单朴素的实现,网上很多直接is>>str.data的方法是错误的,因为不能确定str.data的大小和即将输入的字符串的大小关系。

istream& operator>>(istream &is, String &str)//输入

{char tem[1000]; //简单的申请一块内存

is >>tem;

str.length=strlen(tem);

str.data= new char[str.length + 1];

strcpy(str.data, tem);return is;

}//重载输出运算符,只需简单地输出字符串的内容即可。注意为了实现形如cout<

ostream& operator<

{

os<

}

inlineconst char* String::c_str() const//获取C字符串

{returndata;

}

相关文章:

  • ant design 中,使用dva/fetch 设置导致无法从后台导出excel的问题
  • python引用计数实例_Python中的引用计数法
  • LoadRunner Vuser接口测试脚本 Post举例
  • java 类的继承_Java:类与继承
  • 浅谈对象的复制拷贝
  • java官方网站下载_java下载 7.0 官方版
  • asp.net的% %特定用法
  • java代码shiro注解_java相关:Shiro集成Spring之注解示例详解
  • Oracle Shared Pool机制之——Latches, Locks, Pins and Mutexes
  • java生成apk工具_用Android SDK Build Tools手动构建APK
  • C++常用数据类型
  • java的继承机制有什么好处_JAVA基础-继承机制
  • java类的三种特性_第10章 Java类的三大特性之一:多态
  • 微信公众平台接口测试账号申请
  • java系统类的使用体验_javamelody使用体验
  • [PHP内核探索]PHP中的哈希表
  • 【Leetcode】101. 对称二叉树
  • 【Leetcode】104. 二叉树的最大深度
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • AHK 中 = 和 == 等比较运算符的用法
  • IDEA常用插件整理
  • JavaScript类型识别
  • js如何打印object对象
  • Redis的resp协议
  • Vue 2.3、2.4 知识点小结
  • Zepto.js源码学习之二
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 构造函数(constructor)与原型链(prototype)关系
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 实现简单的正则表达式引擎
  • 使用agvtool更改app version/build
  • 网络应用优化——时延与带宽
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 栈实现走出迷宫(C++)
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​iOS安全加固方法及实现
  • #laravel 通过手动安装依赖PHPExcel#
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (13)Hive调优——动态分区导致的小文件问题
  • (MATLAB)第五章-矩阵运算
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)理解angular中的module和injector,即依赖注入
  • (三十五)大数据实战——Superset可视化平台搭建
  • (生成器)yield与(迭代器)generator
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)UDP基本编程步骤
  • (转)关于多人操作数据的处理策略
  • .naturalWidth 和naturalHeight属性,