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

  1. ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...

  2. 从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值   比如 public Users Get(int id) ,它可以使用两种方式获取:   api/default/5 $.get("/api/default" ...

  3. c++简单String类实现

    #include <iostream> #include <string> using namespace std; class String { public: String ...

  4. STL基础--String

    String 构造 string s1("Hello"); string s2("Hello", 3); //s2: Hel string s3(s1, 2); ...

  5. cstring 转 string

    都通过基本类型来转换即可:CString可以转换为基本类型LPCTSTR,LPCTSTR根据项目编码可以是const char*或者const wchar_t*:string可以用c_str()转换为 ...

  6. 第一节: Redis之String类型和Hash类型的介绍和案例应用

    一. String类型基础 1.类型介绍 典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下. 2. 指令Api说明 3.常用Api说明 (1).StringS ...

  7. IL异常处理

    异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...

  8. python leetcode 1

    开始刷 leetcode, 简单笔记下自己的答案, 目标十一结束之前搞定所有题目. 提高一个要求, 所有的答案执行效率必须要超过 90% 的 python 答题者. 1. Two Sum. class ...

  9. JavaScript常用对象的方法和属性

    ---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...

随机推荐

  1. JS面向对象编程之封装

    来源:https://segmentfault.com/a/1190000015843072 我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学 ...

  2. apache、nginx配置openssl自签名证书

    1.生成私钥 生成rsa私钥,des3算法,2048位强度.server.key是秘钥文件名,需要提供一个至少4位的密码. [root@localhost ~]# openssl genrsa -de ...

  3. 1月份中国综合PMI指数为53.2% 企业生产经营活动总体增速加快

    中新社北京1月31日电 (记者 王恩博)中国国家统计局31日发布数据显示,2019年1月份,中国综合PMI产出指数为53.2%,比上月上升0.6个百分点,表明中国企业生产经营活动总体增速加快. 其中, ...

  4. spring-boot下mybatis的配置

    问题描述:spring boot项目想添加mybatis的配置,在src/main/resources目录下新建了mybatis-config.xml文件,在application.propertie ...

  5. 新手上路:Laravel-控制器基础

    1.控制器在哪 Controller目录默认存放于app\Htpp\Controllers下,当然,你可以自定义这个目录: Controllers文件夹有一个控制器基类Controller.php,你 ...

  6. 使用mvp+rxjava+retrofit加载数据

    将mvp和rxjava和retrofit简单整合的列子,让activity的代码不再那么臃肿,只负责显示数据. 关于mvp的介绍可以看这里, 关于Rxjava的介绍可以看这里; 关于retrofit的 ...

  7. 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189

    阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...

  8. B站弹幕系统架构——GOIM解读

    架构图 说明: 1.logic启动http服务器, 接受http请求,用于将数据推送到kafka以及获取在线用户信息,websocket身份校验 2.comet组件起动webdocket/tcp服务, ...

  9. D. Count the Arrays 计数题

    D. Count the Arrays 也是一个计数题. 题目大意: 要求构造一个满足题意的数列. \(n\) 代表数列的长度 数列元素的范围 \([1,m]\) 数列必须有且仅有一对相同的数 存在一 ...

  10. SSM整合案例:图书管理系统

    目录 SSM整合案例:图书管理系统 1.搭建数据库环境 2.基本环境搭建 2.1.新建一个Maven项目,起名为:ssmbuild,添加web的支持 2.2.导入pom的相关依赖 2.3.Maven静 ...