c++简单string实现
string.h
- #pragma once
- class string
- {
- public:
- string(const char* str = nullptr);
- string(const string& str);
- ~string();
- string& operator=(const string& str);
- string& operator+=(const string& str);
- char& operator[](int n) const;
- char& operator[](int n);
- bool operator==(const string& str) const;
- int size() const;
- const char* c_str() const;
- bool empty() const;
- friend const string operator+(const string& lhs, const string& rhs);
- private:
- char *data;
- int length;
- };
string.cpp
- #include "string.h"
- #include <string.h>
- #include <stdio.h>
- const string operator+(const string& lhs, const string& rhs)
- {
- string tmp(lhs);
- tmp += rhs;
- return tmp;
- }
- string::string(const char * str)
- {
- if (!str)
- {
- length = ;
- data = new char[];
- *data = '\0';
- }
- else
- {
- length = strlen(str);
- data = new char[length + ];
- strcpy(data, str);
- }
- printf("string constructor\n");
- }
- string::string(const string & str)
- {
- length = str.size();
- data = new char[length + ];
- strcpy(data, str.c_str());
- printf("string copy constructor\n");
- }
- string::~string()
- {
- length = ;
- delete[] data;
- printf("string destructor\n");
- }
- string& string::operator=(const string & str)
- {
- if (this == &str)
- return *this;
- delete[] data;
- length = str.size();
- data = new char[length + ];
- strcpy(data, str.c_str());
- return *this;
- }
- string & string::operator+=(const string & str)
- {
- length += str.size();
- char *newdata = new char[length + ];
- strcpy(newdata, data);
- strcat(newdata, str.c_str());
- delete[] data;
- data = newdata;
- return *this;
- }
- char& string::operator[](int n) const
- {
- return data[n];
- }
- char& string::operator[](int n)
- {
- return data[n];
- }
- bool string::operator==(const string & str) const
- {
- if (length != str.size())
- return false;
- return strcmp(data, str.c_str()) ? false : true;
- }
- int string::size() const
- {
- return length;
- }
- const char * string::c_str() const
- {
- return data;
- }
- bool string::empty() const
- {
- return length == ;
- }
main.cpp
- #include"string.h"
- int main()
- {
- char a[] = "hello", b[] = "world";
- string s1(a), s2(b);
- string s3 = s1 + s2;
- return ;
- }
string的+运算符重载进行了返回值优化,在Visual Studio Release模式下main函数中会调用两次构造函数、一次复制构造函数、一次析构函数,比起不做优化减少了一次构造函数和一次析构函数
- string constructor
- string constructor
- string copy constructor
- string destructor
- string destructor
- string destructor
c++简单string实现的更多相关文章
- ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...
- 从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/5 $.get("/api/default" ...
- c++简单String类实现
#include <iostream> #include <string> using namespace std; class String { public: String ...
- STL基础--String
String 构造 string s1("Hello"); string s2("Hello", 3); //s2: Hel string s3(s1, 2); ...
- cstring 转 string
都通过基本类型来转换即可:CString可以转换为基本类型LPCTSTR,LPCTSTR根据项目编码可以是const char*或者const wchar_t*:string可以用c_str()转换为 ...
- 第一节: Redis之String类型和Hash类型的介绍和案例应用
一. String类型基础 1.类型介绍 典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下. 2. 指令Api说明 3.常用Api说明 (1).StringS ...
- IL异常处理
异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...
- python leetcode 1
开始刷 leetcode, 简单笔记下自己的答案, 目标十一结束之前搞定所有题目. 提高一个要求, 所有的答案执行效率必须要超过 90% 的 python 答题者. 1. Two Sum. class ...
- JavaScript常用对象的方法和属性
---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...
随机推荐
- Jmeter:运行报:Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details
最近在用jmeter做压测,上周五压测的脚本,今天早晨结束后. 点击同样的脚本,运行就报Error occurred starting thread group :线程组, error message ...
- python学习笔记(二)---for循环与操作列表
内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...
- Nginx四层代理
Nginx支持四层代理 http://nginx.org/en/docs/stream/ngx_stream_core_module.html 该ngx_stream_core_module模块自1. ...
- 利用requests, beautifulsoup包爬取股票信息网站
这是第一次用requests, beautifulsoup实现爬虫,此次爬取的是一个股票信息网站:http://www.gupiaozhishi.net.cn. 实现非常简单,只是为了demo使用的数 ...
- JavaScript HTMlL DOM对象(上)
Dom:document.相当于把所有的html文件,转换成了文档对象. 之前说过:html-裸体的人:css-穿上衣服:js-让人动起来. 让人动起来,就得先找到他,再修改它内容或属性. 找到标签 ...
- Flutter自己实现一个ProgressHUD
用惯了iOS的SVProgressHUD,但是在flutter pub上的并没有找到类似的实现,于是自己实现一个 主要实现四个基本功能 Loading显示 成功显示 错误显示 进度显示:环形进度条和文 ...
- LightOJ 1287 Where to Run(期望)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1287 题意:给定一个n个点的无向图(0到n-1),你开始在0.你开始遍历这个图 ...
- 《LabVIEW 虚拟仪器程序设计从入门到精通(第二版)》一1.3 小结
本节书摘来自异步社区<LabVIEW 虚拟仪器程序设计从入门到精通(第二版)>一书中的第1章,第1.3节,作者 林静 , 林振宇 , 郑福仁,更多章节内容可以访问云栖社区"异步社 ...
- vscode快捷替换json格式
i=json from=AUTO to=AUTO smartresult=dict client=fanyideskweb salt=1537359261311 sign=06b7d1398ebdc6 ...
- 用 GitHub Action 构建一套 CI/CD 系统
缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...