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. 百度云虚拟空间(BCH)

    百度云虚拟空间(BCH)上的一些默认配置 :first-child { margin-top: 0;}blockquote > :last-child { margin-bottom: 0;}i ...

  2. Python学习16之input函数

    '''''''''Input函数:作用:接受一个标准输入数据返回值:返回为 string 类型使用:input()'''a=input("请输入一个整数")print(a)prin ...

  3. linux sort 命令实用手册

    Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...

  4. 解决Vue-cli3.0下scss文件编译过慢、卡顿问题

    在使用Vue-cli 3.0构建的项目中,可能存在项目编译过慢的问题,具体表现在编译时会在某一进度比如40%时停顿,等好一会儿才能够编译完成.这使得浏览器中的实时预览也会卡顿,不利于我们快速查看效果, ...

  5. Java反射与注解

    反射 能够分析类能力的程序称为反射(reflective),代码的这种能力称为"自省".反射机制的功能极其强大,反射机制可以用来: 在运行时分析类的能力 在运行时查看对象,例如,编 ...

  6. 硬纪元AI峰会前瞻:如何才能做好智能家居?用户体验最重要

    用户体验不到位,市场就不能说真的发展起来. 可以明显的感觉到,随着人工智能.物联网等技术的发展和应用,我们的生活正在发生翻天覆地的变化,其中感觉最为明显的就是智能家居. 据前瞻产业研究院的数据统计,我 ...

  7. Mobile Communication

    最近面试有被问到LTE,感觉说得不太清楚,重新整理一遍. 一.第一代移动通信系统 1G,诞生于1980年左右.模拟通信系统,抗干扰性能差,使用FDMA技术,主要用来传输话音信号,最拉风的就是" ...

  8. POJ 1170 Shopping Offers非状态压缩做法

    Shopping Offers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5659 Accepted: 2361 Descr ...

  9. 图论--传递闭包(Floyd模板)

    #include<iostream> #include<cstring> #include<cmath> using namespace std; int dp[1 ...

  10. 信息奥赛一本通1486: CH 6202 黑暗城堡 最短路径生成树计数

    1486:黑暗城堡 [题目描述] 知道黑暗城堡有 N 个房间,M 条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设 Di为如果所有的通道都被修建,第 i 号房间与第 1 ...