Следующий пример кода из книги "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;
}
Строки с комментариями - мои «исправления». Теперь я хочу знать, что делает "new char [len] +1"? Думаю следующее:
- он выделяет sizeof (char) * len память из кучи
- и возвращает НЕПРАВИЛЬНЫЙ адрес указателю * буфер
- но каков неправильный адрес: «первый адрес новой памяти в куче + 1» или «первый адрес новой памяти в куче + sizeof (char) * 1)?
Что случается? Спасибо
// редактировать Всем спасибо! Ты мне помог! Я просто хотел знать, что вернет это заявление.
new char [len]+1;
Сама строчка, конечно же, опечатка автора книги.
sizeof(char) == 1по определению. - person Kerrek SB   schedule 09.12.2011char*иstrcpyи необработанных массивах. - person Kerrek SB   schedule 09.12.2011std::string, но да. - person cHao   schedule 09.12.2011char*, но вы уверены, что хотите, чтобы они не понимали, почему"hello, " + "world"не работает? В конечном итоге они спросят о SO, и их будут упрекать за то, что они не знают оchar*. Реализация строкового класса, возможно, больше, чем им строго нужно, но я бы предпочел, чтобы они примерно знали, как он работает. - person Steve Jessop   schedule 09.12.2011std::cout << "hello, world\n";, а не нижний уровеньstd::puts("hello, world");. Часто высокий уровень проще и легче для понимания, и вы работаете с низким уровнем. Возьмем, к примеру, химию: вы не изучаете уравнения Шредингера для электронов, прежде чем изучите валентность. - person Steve Jessop   schedule 09.12.2011