MyString(重写String)
http://wenku.baidu.com/view/d7ac113243323968011c925b.html
已知类String的原型为:
class String{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operator =(const String &other);// 赋值函数
private:
char *m_data; // 用于保存字符串
};
请编写String的上述4个函数。
/*
ccnu_hupo_cpp_class_tst6exercise2_by:lele_2013_10_30
new不忘delete
Design the string class in the C++ library by providing your own implementation for the following functions (name your class MyString): MyString();//构造
MyString(const char* cString);//地址不能变
char at(int index) const;//输入数组下标,返回字符
int length() const;//长度
void clear();//清空 len=0
bool empty() const;//是否清空?len不变
int compare(const MyString& s) const;//
int compare(int index, int n, const MyString& s) const;
void copy(char s[], int index, int n);
char* data() const;
int find(char ch) const;
int find(char ch, int index) const;
int find(const MyString& s, int index) const; */ #include<iostream>
#include<string.h>
using namespace std;
class MyString
{
public:
MyString(void):a(NULL){cout << "MyString()" << endl;}
MyString(const char* cString=NULL);//ordinary func
MyString(const MyString &other);//copy func
MyString & operator =(const MyString &other);//assign func
//~MyString(void);
char at(int index) const;//
int length() const;
void clear();
bool empty() const;
int compare(const MyString& s) const;
int compare(int index, int n, const MyString& s) const;
void copy(char s[], int index, int n);
char* data() const;
int find(char ch) const;
int find(char ch, int index) const;
int find(const MyString& s, int index) const; // MyString &operator+=(const MyString &other);
//MyString operator +(const MyString &mystr);
//MyString &operator +(const MyString &mystr);
//重载为友元函数,重载"+"运算符(不改变被加对象) 注意返回引用不行
friend MyString operator +(const MyString& mystr1,const MyString &mystr2);
MyString &operator+=(const MyString &other); bool operator > (const MyString & another);
bool operator < (const MyString & another);
bool operator == (const MyString & another); char& operator[](int idx); void dis();
friend ostream& operator<<(ostream& os,const MyString& other); ~MyString(); private:
char *a;
int len;
}; //MyString::MyString(){
// cout << "MyString()" << endl;
//}
MyString::~MyString(){
cout<<"~MyString():delete..."<<endl;
delete []a;
} MyString::MyString(const char* cString)
{
if (cString==NULL)
{
a=new char[];
a[]=;
//int len=0;
}
else
{
len = strlen(cString);//new
a=new char [len+];
strcpy(a,cString);
//len=strlen(cString);
}
} MyString::MyString(const MyString &other){
int len = strlen(other.a);
a = new char[len+];
strcpy(a, other.a);
} MyString &MyString::operator =(const MyString &other){
//self check assign
if(this == &other){
return *this;
}
//释放原有的内存资源
delete []a;
//分配新的内存资源,并复制内容
int len = strlen(other.a);
a = new char[len+];
strcpy(a, other.a);
//返回本对象的引用
return *this;
} char MyString::at(int index) const
{
if(len==)
{cout<<"no char in string"<<endl;
return ;
}
if(index>len)
{
cout<<"the maximun array exceed"<<endl;
return ;
}
else
{ return a[index-];
}
} int MyString::length() const
{
return len;
} void MyString::clear()
{
if(!a)
{
delete []a;
a=NULL;
} len=;
//a=" ";
}
bool MyString::empty() const
{
if(len==)
return true;
else
return false;
} int MyString::compare(const MyString& s) const
{
int m=this->len;int n=s.len; for(int i=;i<m&&i<n;i++)
{
if(s.a[i]==a[i])
continue;
else if(s.a[i]<a[i])
return ;
else
return -;
}
return ; }
int MyString::compare(int index, int n, const MyString& s) const
{
int m=len,k=s.len;
if(index+n>m||index+n>k)
{
cout<<"cannot compare!"<<endl;
///I dont know how to solve it
}
for(int i=index-,j=;i<n+index;i++,j++)
{
if(s.a[j]==a[i])
continue;
else if(s.a[j]<a[i])
return ;
else
return -;
}
return ;
} void MyString::copy(char s[], int index, int n)
{
if(n>=len)
{cout<<"the maximun array exceed"<<endl;}
else if(n+index->len)
{
cout<<"the maximun array exceed"<<endl;
return;
}
else
{
for(int i=n-,j=;i<n+index-;i++,j++)
s[j]=a[i];
} }
char* MyString::data() const
{
return a;
} int MyString::find(char ch) const
{ for(int i=;i<len;i++)
{
if(ch==a[i])
return i+;
} return ;
}
int MyString::find(char ch, int index) const
{
if(index>len||index<)
{
cout<<"the index num is should be 1~ "<<len<<endl;
return ;
}
for(int i=index-;i<len;i++)
{
if(ch==a[i])
return i+;
}
return -; } int MyString::find(const MyString& s, int index) const
{
if(index>s.len||index<)
{
cout<<"the index num is should be 1~ "<<s.len<<endl;
return ;
}
char ch=s.a[index-]; for(int i=;i<len;i++)
{
if(ch==a[i])
return i+;
} return ;
} // 加法运算符重载
//MyString MyString::operator +(const MyString & another){
// int len = strlen(this->a) + strlen(another.a);
// MyString str(""); // delete []str.a;
// str.a = new char[len + 1];
// memset(str.a,0,len + 1);
// //int len1 = strlen(this->a) + 1;
// //strcat_s(str.a, len1, this->a);
// strcat(str.a, this->a);
// // 源串长度 + 目标串长度 + 结束符
// //int len2 = strlen(this->a) + strlen(another.a) + 1;
// //strcat_s(str.a,len2, another.a);
// strcat(str.a, another.a);
// return str;
//} //MyString MyString::operator +(const MyString &mystr){//mem leak
// MyString newString("");
// if (!mystr.a)
// newString = *this;
// else if (!a)
// newString = mystr;
// else {
// newString.a = new char[strlen(a) + strlen(mystr.a) + 1];
// strcpy(newString.a, a);
// strcat(newString.a, mystr.a);
// }
// return newString;
//} //重载"+"运算符(不改变被加对象)
//MyString &MyString::operator +(const MyString &mystr){
// MyString *temp=new MyString("");
// temp->a=new char[strlen(a)+strlen(mystr.a)+1];
// strcpy(temp->a,a);
// strcat(temp->a,mystr.a);
// return *temp;
//} /*
//重载"+"运算符(改变被加对象)
Mystring &operator +(Mystring &mystr){
char *temp=str;
str=new char[strlen(temp)+strlen(mystr.str)+1];
strcpy(str,temp);
strcat(str,mystr.str);
delete [] temp;
return *this;
}
*/
//friend
MyString operator +(const MyString& mystr1,const MyString &mystr2){
MyString str("");
delete[] str.a;
str.len = strlen(mystr1.a)+strlen(mystr2.a);
str.a = new char[str.len + ];
strcpy(str.a, mystr1.a);
strcat(str.a, mystr2.a);
return str; // //MyString *temp=new MyString("");//mem leak
// MyString temp("");
// temp.a=new char[strlen(mystr1.a)+strlen(mystr2.a)+1];
// //temp->a=new char[strlen(mystr1.a)+strlen(mystr2.a)+1];
// strcpy(temp.a,mystr1.a);
// strcat(temp.a,mystr2.a);
// return temp;
} // ==关系运算符重载
bool MyString::operator==(const MyString &other)
{
if(strcmp(this->a,other.a) == )
return true;
else
return false;
}
// >关系运算符重载
bool MyString::operator>(const MyString &other)
{
if(strcmp(this->a,other.a) > )
return true;
else
return false;
}
// <运算符重载
bool MyString::operator<(const MyString &other)
{
if(strcmp(this->a,other.a) < )
return true;
else
return false;
}
// []运算符重载
char& MyString::operator[](int idx)
{
return a[idx];
} ostream& operator<<(ostream& os,const MyString& other){
return os << other.a;
} MyString &MyString::operator+=(const MyString &other)
{
int len = strlen(a) + strlen(other.a) + ;
char *newstr = new char[len];
memset(newstr, , len);
strcpy(newstr, a);
strcat(newstr, other.a); delete[] a; a = newstr;
return *this;
} int main(){
MyString ms="hello"; MyString mt("world");
mt += ms;
cout << mt << endl;
return ;
}
MyString(重写String)的更多相关文章
- 重写String类,也有些区别,供参考
头文件如下: #pragma once #include <string> #include <string.h> #include <stdlib.h> #inc ...
- C++ string 类重写
(我们知道学习C++时,在学习完C的基础内容后最先上手的就是C++的string类来学习字符串处理的内容,这里我们通过重写string类来重新认识字符串处理的内容) 1.树立string类主要函数,确 ...
- (1)Object类 (2)包装类和数学处理类 (3)String类
1.Object类1.1 基本概念 java.lang.Object类是Java类层次结构的根类,任何类都是Object类的直接/间接子类. 1.2 常用的方法(重点) Object() - 无参构造 ...
- JavaScript学习笔记之string
字符串定义: 1,var myString=“内容”:or var myString=‘内容’ 2,var myString= new String(“内容”) ---〉创建对象, ...
- 常用API——字符串String型函数
上图: 声明 var myString = new String(“Every good boy does fine.”); var myString = “Every good boy does f ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Check if a string is NULL or EMPTY using PowerShell
http://techibee.com/powershell/check-if-a-string-is-null-or-empty-using-powershell/1889 Check if a s ...
- java基础(六)-----String性质深入解析
本文将讲解String的几个性质. 一.String的不可变性 对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创建就不可以修改 ...
- java基础(五) String性质深入解析
引言 本文将讲解String的几个性质. 一.String的不可变性 对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创 ...
随机推荐
- json不转化值是null的字段
今天写东西,发现JSONObject.fromObject(),方法,会把value是null的字段,转为0或"",就自己写了一个方法,如果value是null就不转换 packa ...
- 如何在网页端启动WinForm 程序
在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的 ...
- HDU 1174 爆头(计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1174 解题报告:就是用到了三维向量的点积来求点到直线的距离,向量(x1,y1,z1)与(x2,y2,z ...
- BZOJ 4423: [AMPPZ2013]Bytehattan
Sol 对偶图+并查集. 思路非常好,将网格图转化成对偶图,在原图中删掉一条边,相当于在对偶图中连上一条边(其实就是网格的格点相互连边),每次加边用并查集维护就可以了. 哦对,还要注意边界就是网格外面 ...
- 把strassen乘法调出来了...
完美... 指针搞死我了 /// /// Author: zball /// No rights reserved /// (Creative Commons CC0) /// #include &l ...
- Bootstrap之表格checkbox复选框全选
效果图: HTML中无需添加额外的一列来表示复选框,而是由JS完成,所以正常的表格布局就行了: <table class="table table-bordered table-hov ...
- Course Schedule I & II
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- 【转】.so兼容32位和64位
本文转自:http://blog.csdn.net/fwt336/article/details/51700300 安卓的兼容性是一个很令人头疼的问题,这几天又遇到了,还好还是解决了. 我遇到的问题是 ...
- oracle 学习
一.数据库语言部分1. SQL语言:关系数据库的标准语言2. PL/SQL:过程化语言Procedural Language3. SQL*Plus:简单的报表,操作系统接口 4. Oracle 8.0 ...
- Linux下安装Nginx服务器
安装Nginx之前,首先要安装好编译环境gcc和g++,然后以CentOS为例安装Nginx,安装Nginx需要PRCE库.zlib库和ssl的支持,除了ssl外其他的我们都是去官网下载: Nginx ...