C++实现String类
http://blog.csdn.net/randyjiawenjie/article/details/6709539
C++实现String类,还没有完成,待继续。
有以下注意的点:
(1)赋值操作符返回的是一个MyString&,而重载的+返回的是一个MyString。其中的原因参看《effective c++》,主要是返回引用的时候,必须返回必须在此函数之前存在的引用,因为引用是一个名字,“在我们使用之前,必须想想他代表了那个名字“。如果返回了一个局部对象的引用,那么这个函数结束后,这个引用就会指向一个不存在的对象,显然,这是走上了行为未定义的快车道。
- # include <iostream>
- # include <memory>
- # include <cstring>
- using namespace std;
- class MyString {
- private:
- char *m_data;
- public:
- MyString();
- MyString(const char* ptr);
- MyString(const MyString& rhs);
- ~MyString();
- MyString& operator=(const MyString& rhs);
- MyString operator+(const MyString& rhs);
- char operator[](const unsigned int index);
- bool operator==(const MyString& rhs);
- friend ostream& operator<<(ostream& output, const MyString &rhs);
- };
- //默认的构造函数
- MyString::MyString() {
- m_data = new char[1];
- *m_data = '\0';
- }
- //使用const char* 来初始化
- MyString::MyString(const char* ptr) {
- if (NULL == ptr) {
- m_data = new char[1];
- *m_data = '\0';
- } else {
- int len = strlen(ptr);
- m_data = new char[len + 1];
- strcpy(m_data, ptr);
- }
- }
- //拷贝构造函数
- MyString::MyString(const MyString& rhs) {
- int len = strlen(rhs.m_data);
- m_data = new char[len + 1];
- strcpy(m_data, rhs.m_data);
- }
- bool MyString::operator ==(const MyString& rhs) {
- int result = strcmp(m_data, rhs.m_data);
- if (0 == result)
- return true;
- else
- return false;
- }
- //赋值操作符
- MyString& MyString::operator =(const MyString& rhs) {
- if (this != &rhs) {
- delete[] m_data;
- m_data = new char[strlen(rhs.m_data) + 1];
- strcpy(m_data, rhs.m_data);
- }
- return *this;
- }
- //重载运算符+
- MyString MyString::operator+(const MyString &rhs) {
- MyString newString;
- if (!rhs.m_data)
- newString = *this;
- else if (!m_data)
- newString = rhs;
- else {
- newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];
- strcpy(newString.m_data, m_data);
- strcat(newString.m_data, rhs.m_data);
- }
- return newString;
- }
- //重载下标运算符
- char MyString::operator [](const unsigned int index) {
- return m_data[index];
- }
- //析构函数
- MyString::~MyString() {
- delete[] m_data;
- }
- //重载<<
- ostream& operator<<(ostream& output, const MyString &rhs) {
- output << rhs.m_data;
- return output;
- }
- int main() {
- const char* p = "hello,world";
- MyString s0 = "hello,world";
- MyString s1(p);
- MyString s2 = s1;
- MyString s3;
- s3 = s1;
- MyString s4 = s3 + s1;
- bool flag(s1 == s2);
- cout << s0 << endl;
- cout << s1 << endl;
- cout << s2 << endl;
- cout << s3 << endl;
- cout << flag << endl;
- char result = s3[1];
- cout << result << endl;
- cout << s4 << endl;
- return 0;
- }
运行结果:
hello,world
hello,world
hello,world
hello,world
1
e
hello,worldhello,world
C++实现String类相关推荐
- C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)
1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...
- java string改变的影响_为什么Java的string类要设成immutable(不可变的)
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...
- C++——String类超详细介绍
(欢迎及时指正错误!谢谢) STL的含义:标准模板库 STL的内容: 容器:数据的仓库 算法:与数据结构相关的算法.通用的算法(和数据结构无关) 注:熟悉常用的算法 sort reverse 迭代器 ...
- 标准C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- c++ string replace_JAVA应用程序开发之String类常用API
[本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 API ( Application Interface 应用程序接口)是类中提供的接口, ...
- javascript:为string类添加三个成员,实现去左,右,及所有空格
<script language="JavaScript"> //此处为string类添加三个成员 String.prototype.Trim = func ...
- 字符串(string类)
[1]String类基本函数如何实现? 示例代码如下: 1 #include<iostream> 2 #include<assert.h> 3 #include<stri ...
- 交换变量和String类初始化:JAVA入门基础
本文主要介绍了变量交换.String类初始化.字符串的基本操作.变量交换详解介绍了两个变量是如何交换的,通过例子理解这个用法. 一.交换变量 1.什么是交换变量 例如用户输入a.b的值分别3,9的整数 ...
- 带你进入String类的易错点和底层本质分析!
来源:https://my.oschina.net/liboware/blog/5076245 字符串拼接及创建的案例分析 案例一 String a = "test"; Strin ...
- string类具体用法
string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...
最新文章
- ecs服务器配置git_基于ECS和NAS搭建个人网盘
- 在java中 接口修饰符,Java接口中的修饰符
- php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程
- Spring与Rails的jQuery UJS
- mysql char(36)_MySQL中char(36)被认为是GUID导致的BUG及解决方案
- Spark源码分析之Master注册机制原理
- rose顺序图转换为协作图_如何用GX Developer编程软件编写SFC顺序功能图?
- magento邮件使用php,用Magento的Email模板机制发邮件
- js面向对象编程(三)非构造函数的继承(转载)
- 关于特征筛选中的IV值
- exosip鉴权及使用
- UI设计技巧|PS实现照片水彩画效果
- 网络基础该从哪开始补?这36张图,一次性理清
- 什么是Android SDK
- 鸿蒙第三代手机,原创 荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了...
- Mac m1 安装php redis扩展
- UIQ来电监听挂断原理和代码
- Python for everyone chapter 1
- 百度适配代码【移动搜索】如何让百度正确识别跳转适配关系
- 视频直播软件开发关于亚马逊s3接入方式,视频直播源码创建存储桶方法
热门文章
- vs xxxxx nuget配置无效
- 010-python基础-数据类型-字符串操作
- Jade之Extends
- Android PreferenceActivity 使用
- java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
- pyqt开发的程序模板_小程序定制开发和模板开发要多少钱?有什么区别?
- c mysql二进制,MySQL运用connector C/C+读取二进制字段
- java文本框双击可编辑_java swing 文本域双击变为可编辑
- git 忽略 部分文件夹_git设置忽略文件和目录
- arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解