Несколько замечаний по поводу стиля:
Код:
![Выделить весь код](images/misc/selectcode.png)
String::String(char*);
// вообще говоря, тогда String str("I Love"); не должно откомпилироваться.
// думаю, что вы компилируете с помощью Borland C++ Builder
// лучше String::String(const char*) - вы ведь строку не меняете.
const String& String::operator=(char*)
// как тогда сделать (str="abc") += "def"?
// лучше const char*
// где оператор копирования?
// по умолчанию: String::String(const String& str) : buffer(str.buffer) {}
// что, конечно же, ошибочно (попробуйте удалить строку и её копию)
const String& String::operator+(char*)
// как вы себе представляете действие c = a + b? (у вас c = a+=b)
// лучше const char*
// учитывая все ошибки, предлагаю переписать класс следующим образом
// я приведу описание класса, а вы можете раскрыть содержимое сами:
class String
{
char* fbuffer;
public:
String();
String(const char* data);
String(const char* data, int size);
String(const char init_symbol, int size=80);
String(const String&);
~String();
String& operator+=(const String&);
String& operator=(const String&);
friend String operator+(const String&,const String&);
int size() const;
const char* c_str() const; // getBuffer()
char& operator[](int n) {return fbuffer[n];}
char& at(int n) throw(std::out_of_range);
const char& operator[](int n) const {return fbuffer[n];}
const char& at(int n) const throw(std::out_of_range);
};
После того, как вы поиграетесь с такой строкой, поймёте, что не смотря на удобство обращения, ей не хватает производительности при операциях сложения. Чтобы увеличить производительность, вы сделаете так:
Код:
![Выделить весь код](images/misc/selectcode.png)
class String
{
char* fbuffer;
unsigned fcapacity; // current buffer size
unsigned fsize; // current string size, < buffer size; fbuffer[fsize] = 0
public:
...
}
Затем захочется поиграть с заменой операторов new/delete на более эффективные, заменой операций сравнения символов на свои (например case-insensitive). Вконце получится шаблон std::basic_string<typename charT, typename charTraits, typename Allocator>.
typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string; // обычная строка
typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > wstring; // обычная уникодовская строка
Код:
![Выделить весь код](images/misc/selectcode.png)
#include <string>
#include <iostream>
int main()
{
// классы стандартной библиотеки обладают:
// высокой производительностью,
// устойчивостью к исключениям,
// гибкостью в конструировании,
// строго соответствуют правилам C++.
std::string string = "I Love";
std::cout << (string+=" C++") << "\n";
std::string s(80, '?');
std::cout << s << "\n";
return 0;
}