注意事項:
對於c語言字串char*,必須在末尾置'\0';
對指標操作時,必須考慮指標為null的情況,對strcpy,strcat等庫函式呼叫也一樣;
對指標重新賦值前必須呼叫delete,同一塊記憶體不能呼叫兩次delete;
返回物件的成員函式要區分返回的是當前物件還是新物件,即函式返回型別是否要取位址(&)
關於迭代器更新一點:
string* sp = new string("hello,world!");
string::iterator it = sp;
迭代器begin()指向string類首字元'h',end()指向末尾字元'!'之後一位的空字元'\0'.
順序迭代:
for (it = sp->begin(); it < sp->end(); it++)
cout << *it;
逆序迭代不能使用for迴圈(for迴圈不能輸出begin()位置的元素),而且必須用字首運算--it:
it = sp->end();
while(it > sp->begin())
cout << *--it;
再更新一下比較操作符「==」,見string.cpp具體實現
string.h
#ifndef string_h
#define string_h
#include class string
//// iterator end() const
private:
int len;
char* data;
/**迭代器
* 使用方法:
* string* sp = new string(s);
* 1.
* string::iterator it;
* it = sp;
* * 2.
* string::iterator it1(sp);
* *迭代器範圍:
* (it<=end()-1);
* (it>=begin());
* 對於+ -運算沒有檢查邊界
*/public:
class iterator
iterator(const iterator &rhs)
iterator(const string *sp)
iterator(const string *sp, int n)
~iterator()
char operator*()
iterator operator++(int)
iterator& operator++()
index++;
if (index > it->len)
it = null;
return *this;
}iterator operator--(int)
iterator& operator--()
index--;
if (index > it->len || index < 0)//越界
it = null;
return *this;
}bool operator==(const iterator &rhs)
return (it == rhs.it && index == rhs.index);
}bool operator!=(const iterator &rhs)
return !(*this == rhs);
}bool operator<(const iterator &rhs)
return (index < rhs.index);
}bool operator<=(const iterator &rhs)
return (index <= rhs.index);
}bool operator>(const iterator &rhs)
return (index > rhs.index);
}bool operator>=(const iterator &rhs)
return (index >= rhs.index);
}iterator operator+(const int k)
return iterator(it, index + k);
}iterator operator-(const int k)
return iterator(it, index - k);
}// friend class string;
private:
const string* it;
int index;
};iterator begin() const
iterator end() const
};#endif /* string_h */
string.cpp
/*
* to change this license header, choose license headers in project properties.
* to change this template file, choose tools | templates
* and open the template in the editor.
*/#include "string.h"
#include #include string::string()
string::string(const char* str) else
}string::~string()
}inline int string::length()const
char* string::tostring()const
char* string::c_str()const
string& string::insert(const char ch, const int n)
string& string::remove(const int n)
string& string::remove(const int start, const int nchars)
char string::operator(const int n) const
return *(data + n);
}std::ostream & operator<<(std::ostream & os, const string & str)
std::istream & operator>>(std::istream & is, const string & str)
int string::compare(const string& lhs, const string& rhs) const
if (lhs.len > rhs.len)
return 1;
if (lhs.len < rhs.len)
return 0;
return -1; //==
}bool string::operator==(const string &str)const
//return false;
return (compare(*this, str) == -1);
}bool string::operator!=(const string &str)const
bool string::operator>(const string &str)const
bool string::operator<(const string &str)const
string& string::operator+=(const string &str)
strcat(newstr, str.data);
newstr[len] = '\0';
data = newstr;
return *this;
}string string::operator+(const string &str)const
string& string::operator=(const string &str)
string::string(const string& str)
測試程式
#include #include "string.h"
#include using namespace std;
/* *
*/int main(int argc, char** argv)
自己實現簡單的string類
1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...
自己實現簡單的string類
1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...
自己實現簡單的string類
1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...