1 /*************************************************************************
> File Name: mystring.h
> Author: lukey
> Mail: lukey123@foxmail.com
> Created Time: Wed 17 Jun 2015 08:50:49 PM CST
************************************************************************/ #ifndef __MYSTRING__
#define __MYSTRING__ class String
{
public:
String();
String(const char *);//有参构造函数
String(const String & rhs); //复制构造
~String(); String & operator=(const String & rhs);//赋值运算符的两种情况
String & operator=(const char *str); String & operator+=(const String & rhs);
String & operator+=(const char * str); char & operator[](std::size_t index);
const char & operator[](std::size_t index) const; std::size_t size() const;
const char* c_str() const;
void debug(); //String 类和char相加的几个情况
friend String operator+(const String & s1, const String & s2);
friend String operator+(const String &, const char *);
friend String operator+(const char *, const String &); friend bool operator==(const String &, const String &);
friend bool operator!=(const String &, const String &); friend bool operator<(const String &, const String &);
friend bool operator>(const String &, const String &);
friend bool operator<=(const String &, const String &);
friend bool operator>=(const String &, const String &); friend std::ostream & operator<<(std::ostream & os, const String &s);
friend std::istream & operator>>(std::istream & is, String & s); private:
char *pstr_;
}; #endif
 /*************************************************************************
> File Name: mystring.cc
> Author: lukey
> Mail: lukey123@foxmail.com
> Created Time: Wed 17 Jun 2015 09:18:55 PM CST
************************************************************************/ #include<iostream>
#include<cstring>
#include<stdlib.h>
#include"mystring.h"
using namespace std;
#if 0
class String
{
public:
private:
char *pstr_;
};
#endif //构造函数
String::String()
{
std::cout << "String()" << std::endl;
pstr_ = new char[];//new 已经初始化了
}
String::String(const char *str)//有参构造函数
{
std::cout << "String(const char * str)" << std::endl;
pstr_ = new char[strlen(str)+];
strcpy(pstr_, str);
}
String::String(const String & rhs) //复制构造,考虑自复制情况?
{
std::cout << "String(const String & rhs)" << std::endl;
pstr_ = new char[strlen(rhs.pstr_) + ];
strcpy(pstr_, rhs.pstr_);
}
String::~String()
{
std::cout << "~String()" << std::endl;
delete []pstr_;
} String & String::operator=(const String & rhs)//赋值运算符的两种情况,考虑自赋值情况
{
std::cout << "String & operator=(const String & rhs)" << std::endl;
if(this == &rhs)
return *this;
delete []pstr_;
pstr_ = new char[strlen(rhs.pstr_) + ];
strcpy(pstr_, rhs.pstr_);
return *this;
}
String & String::operator=(const char *str)
{
std::cout << "String & operator=(const char *str)" << std::endl;
pstr_ = new char[strlen(str) + ];
strcpy(pstr_, str);
return *this;
} String & String::operator+=(const String & rhs) //rhs连接到pstr_后面
{
std::cout << "operator+=(const String & rhs)" << std::endl;
int len = strlen(rhs.pstr_) + strlen(pstr_);
pstr_ = (char *)realloc(pstr_, len + );
strcat(pstr_, rhs.pstr_);
return *this;
}
String & String::operator+=(const char * str)
{
std::cout << "operator+=(const char * str)" << std::endl;
int len = strlen(str) + strlen(pstr_);
pstr_ = (char *)realloc(pstr_, len + );
strcat(pstr_, str);
return *this;
} //下标运算符,非常量,可以修改值
char & String::operator[](std::size_t index)
{
return pstr_[index];
} //常量对象取下标,不能为其赋值
const char & String::operator[](std::size_t index) const
{
return pstr_[index];
} //字符串容量
std::size_t String::size() const
{
return strlen(pstr_);
} //转换成c类型字符串,以'\0'结尾
const char* String::c_str() const
{
int len = strlen(pstr_); pstr_[len + ] = '\0';
return pstr_;
} //不懂?打印出字符串?
void String::debug()
{
std::cout << pstr_ << std::endl;
} String operator+(const String & s1, const String & s2)
{
std::cout << "operator+(const String & s1,const String & s2)" << std::endl;
String ret_str = s1.pstr_;
ret_str += s2.pstr_;
return ret_str;
} String operator+(const String & s, const char * str)
{
std::cout << "operator+(String, char *)" << std::endl;
String temp(str);
return (s + temp); //直接调用上面的(+)函数 } String operator+(const char * str, const String & s)
{
std::cout << "operator+( char *, String)" << std::endl;
String temp(str);
return (s + temp); //直接调用上面的(+)函数
} bool operator==(const String & lstr, const String & rstr)
{
std::cout << "==" << std::endl;
if(strcmp(lstr.pstr_, rstr.pstr_) == )
return true;
else
return false;
} bool operator!=(const String & lstr, const String & rstr)
{
std::cout << "!=" << std::endl;
return !(lstr == rstr);
} bool operator<(const String & lstr, const String & rstr)
{
std::cout << "<" << std::endl;
if(strcmp(lstr.pstr_, rstr.pstr_) < )
return true;
else
return false;
} bool operator>(const String & lstr, const String & rstr)
{
std::cout << ">" << std::endl;
if(strcmp(lstr.pstr_, rstr.pstr_) > )
return true;
else
return false;
}
bool operator<=(const String & lstr, const String & rstr)
{
std::cout << "<=" << std::endl;
if(strcmp(lstr.pstr_, rstr.pstr_) <= )
return true;
else
return false;
} bool operator>=(const String & lstr, const String & rstr)
{
std::cout << ">=" << std::endl;
if(strcmp(lstr.pstr_, rstr.pstr_) >= )
return true;
else
return false;
} std::ostream & operator<<(std::ostream & os, const String &s)
{
os << s.pstr_ << " ";
return os;
}
std::istream & operator>>(std::istream & is, String & s)
{
is >> s.pstr_;
return is; //貌似有坑, 目前不能输入空格
} //测试时每个函数调用都打印了信息
int main(void)
{
String s1("hello");
s1.debug();
std::cout << s1;
std::cout << std::endl;
String s2("world");
s2.debug();
if(s1 > s2)
std::cout << "s1 > s2" << std::endl; s1 = s2;
s1.debug();
String s3(s1);
s3.debug(); String s4 = s2 + s3;
s4.debug(); String s5;
std::cout << s5 << std::endl;
std::cin >> s5;
std::cout << s5 << std::endl;
return ;
}

mystring c++ 自己的string 封装的更多相关文章

  1. String封装——读时共享,写时复制

    碰到过一位一直怀疑C++标准库(STL)效率的人,他说STL效率太低,企业开发根本不会用.我是持反对意见的. 说这话的人,肯定没有做过大量的调查.没有调查就没有发言权. STL的效率是不低的,足够满足 ...

  2. [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  3. 467 Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    详见:https://leetcode.com/problems/unique-substrings-in-wraparound-string/description/ C++: class Solu ...

  4. Java中的String为什么是不可变的?

    转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...

  5. c++ string的实现。

    第三次做了.只是做个复习.偶然发现之前的版本有内存泄露.基本功还是不过关.这次应该没有内存泄漏了.虽然是个简单版本. 1)了解堆,栈,值copy. 2)几个常用的c的字符函数和c中的char 如何表示 ...

  6. stl string

    10.2.1 STL的string 1String概念 ²  string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都 ...

  7. Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

    1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...

  8. swift 中String常用操作

    1.  字符串定义 var s = "aaaaaa" // 两个字符串均为空并等价. var emptyString = ""   var anotherEmp ...

  9. Java学习之String对象为什么是不可变的

    转自:http://www.2cto.com/kf/201401/272974.html,感谢作者的总结 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变 ...

随机推荐

  1. oc拨打电话

    判断当前设备是否支持电话功能 +(int)isCanCall{ if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad || [[[UIDevi ...

  2. 多说【最近访客】JS插件通用代码使用方法

    多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加 ...

  3. C++设计模式-Visitor访问者模式

    #include <iostream> #include <string> #include <string.h> #include <memory> ...

  4. JSP简单标签标签库开发

    1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...

  5. js中Object.__proto__===Function.prototype

    参考:http://stackoverflow.com/questions/650764/how-does-proto-differ-from-constructor-prototype http:/ ...

  6. Openlayers 3 的 imagelayer

    <body> <div id="map"></div> <script> var extent = [0, 0, 1024, 968 ...

  7. OpenGL----绘制立方体,定点数组与顶点缓冲

    ,立方体是很简单,但是这里只是拿立方体做一个例子,来说明OpenGL在绘制方法上的改进.从原始一点的办法开始一个立方体有六个面,每个面是一个正方形,好,绘制六个正方形就可以了. glBegin(GL_ ...

  8. ReactiveCocoa的冷信号与热信号 探讨

    背景 ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架.FRP即Functional Reactive Programming(函数式响应式编程), ...

  9. org.apache.lucene.queryParser.ParseException: Encountered "<EOF>" at line 1, column 0.

    如果出现了下列错误,那是因为用错了函数.把queryParser.Query改称queryParser.parse就通过了 org.apache.lucene.queryParser.ParseExc ...

  10. HDU 1532 Drainage Ditches (最大网络流)

    Drainage Ditches Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) To ...