Следующий пример кода из книги «C ++ von A bis Z» (второе издание, перевод: C ++ от A до Z) на стр. 364. Пример неправильный.
// overload operator +=
#include <iostream>
#include <cstring>
using namespace std;
class String {
private:
char* buffer;
unsigned int len;
public:
String(const char* s="") {
// cout << "Constructor: " << s << "\n";
len = strlen(s);
buffer = new char [len+1];
strcpy(buffer, s);
}
~String() {
// cout << "Destructor: " << buffer << "\n";
delete [] buffer;
}
String(const String& s) {
// cout << "Copy_Constructor: " << s.get_buffer() << "\n";
len = s.len;
buffer = new char [len+1];
strcpy(buffer, s.buffer);
}
char* get_buffer() const {
return buffer;
}
// returning a reference is more efficent
// String& operater+=(const String& str1)
String operator+=(const String& str1) {
// cout << "Assignment_Operator +=: " << str1.get_buffer() << "\n";
String tmp(*this);
delete [] buffer;
len = tmp.len + str1.len;
// invalid pointer
// buffer = new char[len+1];
buffer = new char [len]+1;
strcpy(buffer, tmp.buffer);
strcat(buffer, str1.buffer);
// wrong return_type
// return *this;
return buffer;
}
};
int main(void) {
String string1("Adam");
String string2("Eva");
string1+=" und ";
string1.operator+=(string2);
cout << string1.get_buffer() << "\n";
return 0;
}
Theстроки с комментариями - мои "исправления".Теперь я хочу знать, что делает "new char [len] +1"?Я думаю следующее:
- он выделяет sizeof (char) * len памяти из кучи
- и возвращает НЕПРАВИЛЬНЫЙ адрес в указатель * buffer
- но чтонеправильный адрес: «первый адрес новой памяти в куче + 1» или «первый адрес новой памяти в куче + sizeof (char) * 1)?
Что происходит? Спасибо
// edit Спасибо всем! Вы мне помогли! Я просто хотел знать, что вернет это утверждение.
new char [len]+1;
Сама строка, конечно, опечатка от авторакнига.