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

内容写的过于简单,没有涉及到其他格式的如考虑utf_8.这儿单纯的考虑了char的使用.......

 #define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
using namespace std; class MyString { public :
MyString(const char * str = NULL) ; //默认构造函数
MyString(const MyString & mystr); //复制构造函数
~MyString() {
if (test != NULL) delete[] test;
};
//析构函数
int length(); //返回字符串长度
void print(); //打印
char at(int pos) ; //查找第i个字符
MyString & operator = (const MyString &other); //等号操作符重载
MyString & operator = (const char * str ); //等号操作符重载
private:
char * test;
}; //构造函数
MyString::MyString(const char * str) { if (str == NULL)
{
test = new char[];
*test = '\0';
}
else
{
int length = strlen(str);
test = new char[length + ];
strcpy(test, str); //复制
}
} MyString::MyString(const MyString & mystr) //复制构造函数
{
char * pstr = mystr.test;
test = new char [strlen(pstr)+]; //开辟空间
strcpy(test, mystr.test); //复制类容
} //返回长度
int MyString::length() { int i = ;
if (test == NULL) return ;
while (test[i] != '\0') i++;
return i;
} void MyString::print() { if (test != NULL) {
//printf("%s\n",test);
puts(test); //这样可以输出空格
}
} char MyString::at(int pos) { if (test != NULL) {
int len = strlen(test);
if (len <=pos) {
throw out_of_range("位置超过字符串长度!");
}
else {
return test[pos];
}
} {
throw out_of_range("字符串为空!");
}
} MyString & MyString::operator =(const MyString & aa)
{
if (this == &aa)//当地址相同时,直接返回;
return *this;
delete[] test;//当地址不相同时,删除原来申请的空间,重新开始构造;
int length = strlen(aa.test);
test = new char [length + ];
strcpy(test, aa.test);
return *this; } MyString & MyString::operator = (const char * str) //等号操作符重载
{ MyString * ss = new MyString (str);
return *ss;
} int main(){ char *pp = "sadasd";
MyString aa = "abcd";
aa.print(); //显示
cout << "长度为:" << aa.length();
cout << "显示abcd第二个元素的内容"<<aa.at()<<endl; MyString *str = new MyString(pp); //对于指针而言
str->print();
cout << "长度为:" << str->length();
cout << "显示sadasd第二个元素的内容" << str->at()<<endl; MyString bb(aa); //对于复制构造函数而言
bb.print();
cout << "长度为:" << bb.length();
cout << "显示abcd第二个元素的内容" << bb.at()<<endl;
str->print();
getchar();
}

对于这一点,后来又加深了一些基本模式,简略的实现以下String类吧!

 #define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std; template < typename T > class MyString { public : MyString(const T * str = NULL) ;
//默认构造函数
MyString(const MyString<T> & mystr); //复制构造函数
~MyString() {
if (test != NULL) delete[] test;
};
//析构函数
int length(); //返回字符串长度
void print(); //打印
T at(int pos);
MyString<T> & operator + (const MyString<T> &aa); //等号操作符重载
MyString<T> & operator + (const T * str); //等号操作符重载
MyString<T> & operator = (const MyString<T> &aa); //等号操作符重载
MyString<T> & operator = (const T * str ); //等号操作符重载 private:
T * test; }; template < typename T >
MyString<T> & MyString<T>::operator + (const MyString<T> &aa) { T *str =test;
int lena = - , lenb=-;
lena=strlen(aa.test);
lenb = strlen(test);
if (lena> ) {
test = new T[lena+lenb];
strcpy(test, strcat(str, aa.test)); }
return *this;
} template < typename T >
MyString<T> & MyString<T>::operator + (const T * str) { T * str = test;
int lena = -, lenb = -;
lena = strlen(str);
lenb = strlen(test);
if (lena > ) {
test = new T[lena + lenb];
strncpy(test, strcat(str, str));
}
return *this;
} //构造函数
template < typename T >
MyString<T>::MyString(const T * str) { if (str == NULL)
{
test = new T[];
*test = '\0';
}
else
{
int length = strlen(str);
test = new T[length + ];
strcpy(test, str); //复制
}
} template < typename T >
MyString<T>::MyString(const MyString<T> & mystr) //复制构造函数
{
T * pstr = mystr.test;
test = new T [strlen(pstr)+]; //开辟空间
strcpy(test, mystr.test); //复制类容
} //返回长度
template < typename T >
int MyString<T>::length() { int i = ;
if (test == NULL) return ;
while (test[i] != '\0') i++;
return i;
}
template < typename T >
void MyString<T>::print() { if (test != NULL) {
//printf("%s\n",test);
puts(test); //这样可以输出空格
}
}
template < typename T >
T MyString<T>::at(int pos) { if (test != NULL) {
int len = strlen(test);
if (len <=pos) {
throw out_of_range("位置超过字符串长度!");
}
else {
return test[pos];
}
} {
throw out_of_range("字符串为空!");
}
} template < typename T >
MyString<T> & MyString<T>::operator =(const MyString<T> & aa)
{
if (this == &aa)//当地址相同时,直接返回;
return *this;
delete[] test;//当地址不相同时,删除原来申请的空间,重新开始构造;
int length = strlen(aa.test);
test = new T [length + ];
strcpy(test, aa.test);
return *this; } template < typename T >
MyString<T> & MyString<T>::operator = (const T * str) //等号操作符重载
{ MyString<T> * ss = new MyString<T> (str);
return *ss;
} int main(){ char *pp = "sadasd";
MyString<char> aa = "abcd";
aa.print(); //显示
cout << "长度为:" << aa.length();
cout << "显示abcd第二个元素的内容"<<aa.at()<<endl; MyString<char> *str = new MyString<char>(pp); //对于指针而言
str->print();
cout << "长度为:" << str->length();
cout << "显示sadasd第二个元素的内容" << str->at()<<endl; MyString<char> bb(aa); //对于复制构造函数而言
bb.print();
cout << "长度为:" << bb.length();
cout << "显示abcd第二个元素的内容" << bb.at()<<endl;
str->print();
MyString<char> sc="你好,北京人";
sc.print();
sc = sc + bb;
sc.print();
getchar();
return ;
}

String类的先关补充.....

 /*
String类的功能为:
1.构造函数
2.重载赋值操作符
3.重载下标操作符
4.重载关系操作符
5.重载转换操作符
6.析构函数
*/
#include<iostream>
#include<string.h>
#include<assert.h>
#include<string>
using namespace std; class String { //重载输出操作符
friend ostream & operator << (ostream &out, String & str);
friend istream & operator >> (istream &in, String & str);
//重载关系操作符
friend bool operator == (const String &src , const String &op);
friend bool operator != (const String &src, const String &op);
friend bool operator < (const String &src, const String &op);
public :
//定义构造函数
String(); //default
String(const char * str); //elements
String(const String &str); //copy
//重载赋值操作符
String & operator =(const String & str);
String & operator =(const char * str);
String & operator =(const char str);
//+=重载运算操作符
String & operator +=(const String & str);
String & operator +=(const char * str);
String & operator +=(const char str); //重载[]操作符
char & operator [] (int index );
//重载转换操作符
operator char*();
~String();
private:
char *gg ; //字符指针
}; ostream & operator << (ostream &out, String & str) {
out << str.gg ;
return out;
} istream & operator >> (istream &in, String & str)
{
in >> str.gg;
return in ;
} bool operator == (const String &src, const String &op) {
return strcmp(src.gg , op.gg) == ;
} bool operator != (const String &src, const String &op)
{
return strcmp(src.gg , op.gg )!=;
} bool operator < (const String &src, const String &op) {
return strcmp(src.gg ,op.gg )<;
} String::String() {
gg = new char[];
gg = '\0';
}; String::String(const char * str) {
int var = strlen(str);
gg = new char[var+];
strcpy(gg ,str);
} String::String(const String &str) {
int var = strlen(str.gg);
gg = new char[var + ];
strcpy(gg, str.gg);
} String & String::operator =(const String & str) {
if (this == &str) return *this;
delete gg;
int var = strlen(str.gg);
gg = new char[var + ];
strcpy(gg, str.gg);
gg[var] = '\0';
return *this;
} char & String::operator [] (int index) {
assert(index>=&&index<strlen(gg));
return gg[index];
} String & String::operator =(const char * str) {
if (strcmp(gg,str)==) return *this;
int var = strlen(str);
gg = new char(var + );
strcpy(gg, str);
gg[var] = '\0';
return *this;
} String & String::operator = (const char str) { gg = new char();
gg[] = str;
gg[] = '\0';
return *this;
} String::operator char *() {
return gg;
} String::~String() {
delete gg;
} String & String::operator +=(const String & str) {
int var = strlen(str.gg);
if (gg == NULL)
{
gg = new char(var+);
strcpy(gg,str.gg);
gg[var] = '\0';
}
else {
char *p = gg;
int vat = strlen(p) + var;
gg = new char(vat+var);
strcpy(gg,p);
delete p;
strcat(gg,str.gg);
gg[vat] = '\0';
}
return *this;
} String & String::operator +=(const char * str) { int var = strlen(str);
if (gg == NULL)
{
gg = new char(var + );
strcpy(gg, str);
gg[var] = '\0';
}
else {
char *p = gg;
int vat = strlen(p) + var;
gg = new char(vat + var);
strcpy(gg, p);
delete p;
strcat(gg, str);
gg[vat] = '\0';
}
return *this; }
String & String::operator +=(const char str) { if (gg == NULL)
{
gg = new char();
gg[] == str;
gg[] = '\0';
}
else {
char *p = gg;
int vat = strlen(p)+;
gg = new char(vat + );
strcpy(gg, p);
delete p;
gg[vat - ] = str;
gg[vat] = '\0';
}
return *this;
}

关于如何来构造一个String类的更多相关文章

  1. 构造一个String类

    #include "stdafx.h" #include<iostream> #include<string.h> using namespace std; ...

  2. C++自己实现一个String类

    C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...

  3. 实现一个string类

    实现要实现:构造,析构,拷贝构造,赋值的功能 1. 提供构造函数 string(), string(const string & str),string(const  char * str), ...

  4. C++学习之路(六):实现一个String类

    直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public: String(const char *str = ""); ~String(void ...

  5. 一个简单实现的string类

    为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...

  6. 构造和改变一个string的其他方法

    构造一个string的其他方法: 1string s1(cp, n),cp为c风格数组名或一个指向C风格数组的指针,则执行的操作为拷贝从cp开始包括cp在内的接下来n个字符给s1,n的默认值为size ...

  7. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  8. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...

  9. String类的构造方法(2)

    写了常见的几个而已. 1:new 一个String类的时候系统会自动传一个空构造 public String(); 注意: 当对象初始化是 null时 和 对象是 "" 时,两者是 ...

随机推荐

  1. iOS小技巧3

    将颜色合成图片 将颜色合成图片 +(UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1 ...

  2. mvc 数据验证金钱格式decimal格式验证

    mvc 数据验证金钱格式decimal格式验证 首先看下代码 /// <summary> /// 产品单价 /// </summary> [Display(Name = &qu ...

  3. VS2010的Razor智能感知和语法高亮突然消失

    猜想可能是安装了VS2008的原因,尝试重新安装下面的组件,看看是否解决问题: 用于 Visual Studio 2010 SP1 和 Visual Web Developer 2010 SP1 的 ...

  4. linux----------纯净的centos7.0上安装lnmp环境的步骤

    1.先看下screen -S lnmp 命令是否存在,不存在则安装.这个是个什么东东呢?百度一下( GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接 ...

  5. SQL中插入单引号,新增修改删除

    1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可.    例如:在数据库插入'井下设备' :    insert into Static_Bel ...

  6. 关于img 403 forbidden的一些思考

    网页中经常需要显示图片给用户看,对网站本身来说有的图片是从本地图片服务器来的,但是一旦数量多了以后,磁盘空间又是一个问题. 所以有时就希望显示其他网站的Image,直接把其他网站的图片显示在我的网站上 ...

  7. _vimrc默认配置

    "不使用兼容vi的模式set nocompatible source $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimbeh ...

  8. 如何使用百度音乐搜索接口API

    百度有开放音乐搜索的api 比如: http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$ http://b ...

  9. js产生随机数并加入数组

    <!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  10. viewport 详解

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...