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有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...
随机推荐
- 前端日期时间处理建议使用Momen
使用方法 下载: http://momentjs.cn/downloads/moment.js 多语言版本:http://momentjs.cn/downloads/moment-with-local ...
- 2019-2020-1 20199329《Linux内核原理与分析》第三周作业
<Linux内核原理与分析>第三周作业 一.上周问题总结: 第二周头脑风暴完成较慢 虚拟机libc配置错误 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境虚拟一个x86的CPU硬 ...
- Java Web:jstl处理字符串
用法:${fn:methodName(args....)} 在使用这些函数之前必须在JSP中引入标准函数的声明<%@ taglib prefix="fn" uri=" ...
- 从「Hello World」说起
标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...
- Codeforce-CodeCraft-20 (Div. 2)-B. String Modification (找规律+模拟)
Vasya has a string s of length n. He decides to make the following modification to the string: Pick ...
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即 ...
- python(字符编码与转码)
一.字符编码演变史 二进制(0 1) """ 算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的,再说简单点 ...
- nginx判定国家ip访问网站
我们可以通过GeoIP模块和MaxMind免费数据库来实现.MaxMind具有新版本的数据库GeoLite2,它仅支持CSV和mmdb格式.可以支持mngx_http_geoip2_modulemdb ...
- 一元三次方程 double输出 -0.00
求一个 a*x*x*x+b*x*x+c*x+d 的解 题目很简单,但是我输出了-0.00,然后就一直卡着,这个问题以后要注意. 让0.00 编程-0.00的方法有很多. 第一种就是直接特判 if(fa ...
- 美团分布式ID生成框架Leaf源码分析及优化改进
本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...