关于如何来构造一个String类
今天帮着一位大二的学弟写了一个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类的更多相关文章
- 构造一个String类
#include "stdafx.h" #include<iostream> #include<string.h> using namespace std; ...
- C++自己实现一个String类
C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...
- 实现一个string类
实现要实现:构造,析构,拷贝构造,赋值的功能 1. 提供构造函数 string(), string(const string & str),string(const char * str), ...
- C++学习之路(六):实现一个String类
直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public: String(const char *str = ""); ~String(void ...
- 一个简单实现的string类
为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...
- 构造和改变一个string的其他方法
构造一个string的其他方法: 1string s1(cp, n),cp为c风格数组名或一个指向C风格数组的指针,则执行的操作为拷贝从cp开始包括cp在内的接下来n个字符给s1,n的默认值为size ...
- C++面试中string类的一种正确写法
C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...
- (转)C++——std::string类的引用计数
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...
- String类的构造方法(2)
写了常见的几个而已. 1:new 一个String类的时候系统会自动传一个空构造 public String(); 注意: 当对象初始化是 null时 和 对象是 "" 时,两者是 ...
随机推荐
- lua语言三则特性
pack和unpack 对于一个函数, 要将其入参转换为一个表, 则pack函数合适. 对于一个表要将其转换为 一个函数的入参, 则 lua原生提供的 unpack函数可以实现. do arrayDa ...
- 使用Go开发web服务器
原文链接 Go(Golang.org)是在标准库中提供HTTP协议支持的系统语言,通过他可以快速简单的开发一个web服务器.同时,Go语言为开发者提供了很多便利.这本篇博客中我们将列出使用Go开发HT ...
- Nginx安装注意事项
因为nginx需要依赖pcre库.zlib库.openssl库,所以需要下载这三个库以及nginx源码. 下载以上文件到/usr/local/src/目录下 使用tar -zxvf ...
- C# 窗体
窗体的事件:删除事件:先将事件页面里面的挂好的事件删除,再删后台代码里面的事件 Panel是一个容器 1.Label -- 文本显示工具Text:显示的文字取值.赋值:lable1.Text 2.Te ...
- IIS配置注意点
1.是否有权限 2.程序池是否为4.0集成 3.是否启用目录浏览模式:目录浏览==>启用(好像可以不用) 4.是否设置默认页面 5.其他的,百度. asp.net发布到IIS中出现错误:处理程序 ...
- mysql时间格式DATE_FORMAT()
1.以下是mysql查询中用到的时间格式的转化形式例子:SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') -- 2015-10-28 SELECT DATE_FORMAT(NO ...
- js方式找出数组中重复数最多的那个数,并返回该数以及重复次数
function findNum(a){ var result = [0,0]; for (var i = 0; i < a.length; i++) { for (var j = 0,coun ...
- wex5 教程 之 图文讲解 登陆,注册,页面跳转
视频教程地址:http://v.youku.com/v_show/id_XMTc3OTE0Nzg0NA==.html 效果预览: 登陆页面 首页用windowContainer装载 注册页面 登陆 ...
- linux内核常识
找到了一个阅读linux源码的在线工具woboq,但是不能很好地用来阅读live555代码. 比如,我们要阅读epoll实现,可以访问此网址:https://code.woboq.org/linux/ ...
- PHP中怎样创建一个空对象?
如果没有声明一个对象然后就对其属性赋值会出现警告.那么我们给它创建一个空对象然后赋值就好了.PHP中创建一个空对象代码如下: 第一种方式: $empty_object = new stdClass() ...