#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class MyString
{
public:
MyString::MyString();         //无参构造
MyString(const char* str );     //默认参数
MyString(const MyString& other);   //拷贝构造
MyString& operator=(const MyString& other);  //重载等号(参数不同)
MyString& operator=(const char* str);      //重载等号(参数不同)
~MyString();              //析构函数
char& operator[](unsigned int index);      //重载[]号 MyString& operator+=(const MyString& other);  //重载+=号
friend MyString operator+(const MyString& s1, const MyString& s2);  //重载加号;用全局的友元函数
friend ostream& operator<<(ostream& os, const MyString& str);      //重载左移操作符;用全局函数
  
friend istream& operator>>(istream& is, MyString& str);          //重载右移操作符,用全局函数
private:
char* m_str;
}; MyString::MyString()
{
m_str = new char[];
m_str = '\0';
} MyString::MyString(const char* str) //默认参数
{
if (str == NULL)
{
m_str = new char[];
m_str = '\0'; }
else
{
int len = strlen(str);
m_str = new char[len + ];
strcpy(m_str, str);
}
} MyString::MyString(const MyString& other)
{
int len = strlen(other.m_str);
m_str = new char[len + ];
strcpy(m_str, other.m_str);
} MyString& MyString::operator=(const MyString& other)
{
if (&other == this)
return *this;
if (m_str != NULL)
{
delete[]m_str;
} int len = strlen(other.m_str);
m_str = new char[len + ];
strcpy(m_str, other.m_str);
return *this;
} MyString& MyString::operator=(const char* str)
{
if (m_str != NULL)
{
delete[]m_str;
} if (str == NULL)
{
m_str = new char[];
m_str = '\0';
}
else
{
int len = strlen(str);
m_str = new char[len + ];
strcpy(m_str, str);
} return *this;
}
MyString::~MyString()
{
if (m_str != NULL)
{
delete[]m_str;
m_str = NULL;
}
}
char& MyString::operator[](unsigned int index)
{
unsigned int len = strlen(m_str);
if (index > len)
return m_str[len]; return m_str[index];
} MyString& MyString::operator+=(const MyString& other)
{
int len = strlen(m_str) + strlen(other.m_str);
char *newstr = new char[len + ];
strcpy(newstr, m_str);
strcat(newstr, other.m_str); if (m_str != NULL)
{
delete[]m_str;
}
m_str = newstr; return *this;
}
MyString operator+(const MyString& s1, const MyString& s2)
{
int len = strlen(s1.m_str) + strlen(s2.m_str);
char *newstr = new char[len + ];
strcpy(newstr, s1.m_str);
strcat(newstr, s2.m_str); MyString My(newstr); return My;
}
ostream& operator<<(ostream& os, const MyString& str)
{
os << str.m_str << endl;
return os;
}
istream& operator>>(istream& is, MyString& str)
{
char newstr[];
is >> newstr;
int len = strlen(newstr);
if (str.m_str != NULL)
{
delete []str.m_str;
}
str.m_str = new char[len + ];
strcpy(str.m_str, newstr); return is;
} //测试代码
void test11()
{
MyString m1;
MyString m2("nihao");
MyString m3(m2);
cout << m2;
cout << m3;
m1 = m2 + m3;
cout << m1;
m1 += m3;
cout << m1[-] << endl;
cin >> m3;
cout << m3; } int main()
{ test11(); system("pause");
return EXIT_SUCCESS;
}

自实现部分string类的功能的更多相关文章

  1. String类常用功能

    String类常用功能 判断: boolean equals(Object obj) boolean equalsIgnoreCase(String str) //忽略大小写 boolean star ...

  2. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  3. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  4. 关于如何来构造一个String类

    今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...

  5. VC++ 标准C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  6. c++中string类的详解

    ,<时返回-1,==时返回0  string的子串:string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串strin ...

  7. 标准C++中string类的用法

    转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...

  8. 标准C++中的string类的用法总结(转)

    http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的 ...

  9. C++中的string类(2)

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

随机推荐

  1. 误改sudoers的访问权限后的修复

     sudo: /etc/sudoers is mode 0777, should be 0440"问题的解决方法 ubuntu进入单用户模式,修改sudoers权限,修改root密码 1.重 ...

  2. java乱码问题总结

    在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...

  3. js 封装的自动创建表格的相关操作

    因为要做一个动态输入的表格,现在积累一下资料,在网上找了一些资料,经过总结是使用更加方便些,谁有更好的插件和封装的东西,请大家分享一下. <script type="text/java ...

  4. [漏洞检测]Proxpy Web Scan设计与实现(未完待续)

    Proxpy Web Scan设计与实现 1.简介:          Proxpy Web Scan是基于开源的python漏洞扫描框架wapiti改造的web漏洞扫描器,其主要解决以下几个问题而生 ...

  5. Android SO(动态链接库)UPX加固指南

    前言 随着移动互联网的爆发性增长,人们对移动应用的需求变得越来越复杂,企业在带给用户众多便利和享受的同时,却容易忽视应用自身的安全性问题,一旦遭受攻击,就会给企业和用户的经济或声誉带来影响.本文主要是 ...

  6. 【java】实体类中 Set<对象> 按照对象的某个字段对set排序

    背景: User实体类 有个属性是 Set<PositionChange> 职位变更字段 如下: PositionChange实体类  有个属性是positionStartDate   什 ...

  7. php判断手机客户端

    <?php // check if wap function check_wap(){ if(stristr($_SERVER['HTTP_VIA'],"wap")){// ...

  8. pyqt5生成的APP制作DMG

    http://blog.csdn.net/wudj810818/article/details/70557284 1.环境 Mac OS Python3.5 PyQt5 2.所需工具 Pyinstal ...

  9. MYSQL LIMIT 用法详解

    在mysql的limit用法中,网上有这样的论述: "//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql>SELECT * FROM tab ...

  10. iOS: 设置App的国际化和本地化

    原文链接:http://www.cocoachina.com/appstore/20160310/15632.html 前言 App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的 ...