возврат ссылки на локальную переменную
От: overt Ниоткуда  
Дата: 25.06.08 07:52
Оценка:
Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:


Перегрузка операторов в форме внешних функций
Чтобы перегрузить оператор в форме внешней функции, необходимо определить глобальную
функцию.


class String {
    friend String& operator+(const String&, const String&);
private:
    char* s;
public:
    // Конструкторы и т.д.
}
String& operator+(const String& s1, const String& s2)
{
    char* s = new char[strlen(s1.s) + strlen(s2.s) + 1];
    strcat(s, s1.s, s2.s);
    String newStr(s);
    delete s;
    return newStr;
}
String s1 = “Hello”;
String s2 = “Goodbye”;
String s3 = s1 + s2;


то, что ф-ия strcat() выглядит необычно — это не столь важно, возможно это такое сокращение, но вовзрат ссылки return newStr; ввел меня в сомение, т.к. считал, что этого делать нельзя?! Это не единственный пример в книге с возвратом ссылки на внутреннюю перменную, не мог же он столько раз "ошибиться"?
(MS VS 7.1/8.0)
Re: возврат ссылки на локальную переменную
От: jazzer Россия Skype: enerjazzer
Дата: 25.06.08 07:54
Оценка: +4 -1
Здравствуйте, overt, Вы писали:

O>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:

Не надо читать Джеффа Элджера.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: возврат ссылки на локальную переменную
От: Erop Россия  
Дата: 25.06.08 08:01
Оценка:
Здравствуйте, overt, Вы писали:

O>...не мог же он столько раз "ошибиться"?

1) Как видишь, смог
2) Ты возьми и проверь как такой код работает
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: возврат ссылки на локальную переменную
От: alzt  
Дата: 25.06.08 08:03
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, overt, Вы писали:


O>>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:

J>Не надо читать Джеффа Элджера.

А почему?
Re[3]: возврат ссылки на локальную переменную
От: jazzer Россия Skype: enerjazzer
Дата: 25.06.08 08:12
Оценка: 1 (1)
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, overt, Вы писали:


O>>>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:

J>>Не надо читать Джеффа Элджера.

A>А почему?


Потому что если это та книжка, о которой я думаю, то она очень старая, еще достандартая, года так 95-го.
Поэтому она просто-напросто устарела и учить по ней С++ точно не надо.

Там он обсуждает несколько интересных идей, но это можно читать только опытному программисту, хорошо знающему современный С++ и способному увидеть за деревьями ошибок и кривизны интересную идею. Малоопытный же программист просто запутается в ошибках, которыми полна книга, и в том, как предлагается все реализовывать.
Ну и язык отстойный — очень плохо у него получается излагать свои идеи, приходится продираться через текст, временами догадываясь, что же, собственно, он хотел сказать.

Однозначно не рекомендую для начинающих изучать — есть книги, гораздо более приближенные к современному реальному С++ и гораздо лучше написанные.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: возврат ссылки на локальную переменную
От: alzt  
Дата: 25.06.08 08:18
Оценка:
Здравствуйте, jazzer, Вы писали:

O>>>>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:

J>>>Не надо читать Джеффа Элджера.

A>>А почему?


J>Потому что если это та книжка, о которой я думаю, то она очень старая, еще достандартая, года так 95-го.

J>Поэтому она просто-напросто устарела и учить по ней С++ точно не надо.

Книга старая. Сейчас понятно устарела, редакция требуется. Зато пишет интересно.

J>Однозначно не рекомендую для начинающих изучать — есть книги, гораздо более приближенные к современному реальному С++ и гораздо лучше написанные.


Начинающие изучать вряд ли её читать будут, а кто поопытнее — не будет копировать вслепую.
Re[5]: возврат ссылки на локальную переменную
От: jazzer Россия Skype: enerjazzer
Дата: 25.06.08 08:20
Оценка: +1
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, jazzer, Вы писали:


O>>>>>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:


A>Начинающие изучать вряд ли её читать будут, а кто поопытнее — не будет копировать вслепую.


Имхо, если человек пишет: "дошел до перегрузок и запутался в понятиях" — это как раз начинающий программист
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: возврат ссылки на локальную переменную
От: alexeiz  
Дата: 25.06.08 08:30
Оценка:
Здравствуйте, overt, Вы писали:


O>то, что ф-ия strcat() выглядит необычно — это не столь важно, возможно это такое сокращение, но вовзрат ссылки return newStr; ввел меня в сомение, т.к. считал, что этого делать нельзя?! Это не единственный пример в книге с возвратом ссылки на внутреннюю перменную, не мог же он столько раз "ошибиться"?


Непонятно, где ты это нашел. У меня есть и оригинальная книжка и перевод на русский издания 1999-го года. Сейчас проверил в обоих. Везде возврат по-значению.
Re[2]: возврат ссылки на локальную переменную
От: overt Ниоткуда  
Дата: 25.06.08 08:36
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Непонятно, где ты это нашел. У меня есть и оригинальная книжка и перевод на русский издания 1999-го года. Сейчас проверил в обоих. Везде возврат по-значению.


Год выпуска книги не известен, книга в pdf без титульных листов.
(MS VS 7.1/8.0)
Re[3]: возврат ссылки на локальную переменную
От: alexeiz  
Дата: 25.06.08 08:40
Оценка:
Здравствуйте, overt, Вы писали:

O>Здравствуйте, alexeiz, Вы писали:


A>>Непонятно, где ты это нашел. У меня есть и оригинальная книжка и перевод на русский издания 1999-го года. Сейчас проверил в обоих. Везде возврат по-значению.


O>Год выпуска книги не известен, книга в pdf без титульных листов.


У меня и pdf оказывается есть. И там действительно косяк. Вывод: купи нормальную книжку.
Re: возврат ссылки на локальную переменную
От: Zigmar Израиль  
Дата: 25.06.08 11:50
Оценка:
Здравствуйте, overt, Вы писали:
O>
O>class String {
O>    friend String& operator+(const String&, const String&);
O>private:
O>    char* s;
O>public:
O>    // Конструкторы и т.д.
O>}
O>String& operator+(const String& s1, const String& s2)
O>{
O>    char* s = new char[strlen(s1.s) + strlen(s2.s) + 1];
O>    strcat(s, s1.s, s2.s);
O>    String newStr(s);
O>    delete s;
O>    return newStr;
O>}
O>String s1 = “Hello”;
O>String s2 = “Goodbye”;
O>String s3 = s1 + s2;
O>

Ого, в одном кусочке кода столько ошибок, да еще и в книжке!
1. delete вместо delete[]
2. Несуществующая функция strcat (в таком виде, как она представлена)
3. Возвращение ссылки на локальную переменную
4. Утечка памяти в случае исключения
5. (придирка)Зачем-то создаётся промежуточный буфер, вместо того, чтоб копировать продстрочки прямо в результат нужного размера.
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re: возврат ссылки на локальную переменную
От: Аноним  
Дата: 26.08.09 14:21
Оценка:
Здравствуйте, overt, Вы писали:

O>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:



O>

O>Перегрузка операторов в форме внешних функций
O>Чтобы перегрузить оператор в форме внешней функции, необходимо определить глобальную
O>функцию.


O>
O>class String {
O>    friend String& operator+(const String&, const String&);
O>private:
O>    char* s;
O>public:
O>    // Конструкторы и т.д.
O>}
O>String& operator+(const String& s1, const String& s2)
O>{
O>    char* s = new char[strlen(s1.s) + strlen(s2.s) + 1];
O>    strcat(s, s1.s, s2.s);
O>    String newStr(s);
O>    delete s;
O>    return newStr;
O>}
O>String s1 = “Hello”;
O>String s2 = “Goodbye”;
O>String s3 = s1 + s2;
O>


O>то, что ф-ия strcat() выглядит необычно — это не столь важно, возможно это такое сокращение, но вовзрат ссылки return newStr; ввел меня в сомение, т.к. считал, что этого делать нельзя?! Это не единственный пример в книге с возвратом ссылки на внутреннюю перменную, не мог же он столько раз "ошибиться"?

При каждом вызове функции создаются новые копии аргументов и локальных(автоматических) переменных. Память может повторно использоваться после
возврата из функции, поэтому, указатель на локадьную переменную возвращать не следует. Значение, на кторое он указывает, будет менятся непредсказуемо.(Страусттруп "Язык программирования С++")
Re[3]: возврат ссылки на локальную переменную
От: Lorenzo_LAMAS  
Дата: 26.08.09 14:30
Оценка: +1
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, overt, Вы писали:


O>>>Начал читать Джеффа Элджера "С++", дошел до перегрузок и запутался в понятиях. Там есть такой пример, цитирую:

J>>Не надо читать Джеффа Элджера.

A>А почему?


В наши дни эта книга во многом сборник вредных советов, по-моему. И ошибок там полно. Вон и автор топика столкнулся с этой мурой.
А сколько тут было разговоров по поводу мощных историй элджера о том, что хороший современный компилятор в целях оптимизации выкидывает конструкторы int и т.п. ереси.
Of course, the code must be complete enough to compile and link.
Re[4]: возврат ссылки на локальную переменную
От: Lorenzo_LAMAS  
Дата: 26.08.09 14:31
Оценка:
A>У меня и pdf оказывается есть. И там действительно косяк. Вывод: купи нормальную книжку.

У меня бумажная и там ссылка. И еще других ошибок полно. И что?
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.