今天帮着一位大二的学弟写了一个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. easyui combobox级联(转载)

    一.创建combobox 有如下几种方式可以创建一个combobox 1.使用select标签,并加上class="easyui-combobox",这种方式比较适用于静态的选项. ...

  2. codis配置

    codis集群配置 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表) ...

  3. Java 使用jaxp删除节点

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <perso ...

  4. RDIFramework.NET V2.5(.NET快速信息化系统开发框架) Web版界面样例(可参考)

    RDIFramework.NET V2.5(.NET快速信息化系统开发框架)  Web版介绍 现已升级到V2.8,点击查看 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起 ...

  5. NULLIF()函数使用讲解

    NULLIF()函数接受两个参数.如果它们相等,那么返回空值:否则,返回第一个参数. 等价于下面的表达式: case when expression1=expression2 then null el ...

  6. Jquery入门指南教程

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka jQuery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScr ...

  7. .net 直接输出远程文件到浏览器和下载文件保存到本机

    利用了xmlhttp,实现代码比较简单具体实现如下: 首先bin文件引入,com->microsoft xml v3.0 具体代码如下: protected void Button1_Click ...

  8. RobotFrameWork webservice soap接口测试 (二)

    上一篇提到做soap接口测试自己简单的写了个py,然后就简单的实现了个客户端能对远程接口进行调用,对返回的数据进行解析,可后面想着也觉得不对劲,soap协议虽说不像http协议那么普及,但是现在很多公 ...

  9. JavaWeb应用开发架构浅谈

    本文就我所经历和使用过的技术和框架, 讨论 Java / Javascript 技术组合构成的Web 应用架构. 一. 概述 Web 应用架构可以划分为两大子系统:前端子系统和后台子系统. 前端子系统 ...

  10. 一步一步教你编写与搭建自动化测试框架——python篇

    [本文出自天外归云的博客园] 这两天用python写了一个自动化测试框架,取名为Auty.准备用来做Web方面的接口测试,以下为Auty框架一步一步的搭建过程——