[С++] Поясните механизм возврата значения из метода класса по const ссылке? (Несколько вопросов по С++)

Модератор: Модераторы разделов

Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

[С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение pento »

В чем преимущество возврата значения из метода класса по const ссылке?
Что должен возращать обычный метод-аксессор класса?
Реализованны ли счетчики переменных в g++?
то есть например будет ли происходить копирование при

Код: Выделить всё

string foo = "Hello, world!";
string bar;
bar = foo;

или просто увеличится счетчик ссылок на участок памяти?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение elide »

строка скопируется.
но в пользовательских классах никто не мешает переделать operator= под подсчет ссылок и, скажем, copy-on-write.
насколько я знаю STL (а знаю я его крайне паршиво) на присваивании там все копируется. у меня есть подозрение, что такая семантика закреплена в стандарте. хотя утверждать не буду: стандарт на C++ я так и не "асилил".
слава роботам!
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение sdk »

Не-не, elide не путай товарища! :D

std::string использует copy-on-write, так что строка будет копироваться только если ты чего-нибудь запишешь во вновь созданную копию.
В твоем примере - и foo и bar будут указывать на одну область памяти содержащую "Hello, world!" до тех пор пока ты не сделаешь нечто вроде

Код: Выделить всё

bar += " Ну и ты заходи."


На вопрос: что должен возвращать метод-аксессор есть общий ответ: то, аксесс к чему он предоставляет :D.
Если то что он возвращает нежелательно менять, то возвращай константный указатель/ссылку.

Тебя интересует преимущество возврата по const ссылке по сравнению с чем?

Счетчики ссылок реализуются не в g++, а в libstdc++ ;).
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение pento »

(sdk @ Dec 15 2006, в 04:28) писал(а):Тебя интересует преимущество возврата по const ссылке по сравнению с чем?

Код: Выделить всё

class FooBar {
    string test;
    public:
       FooBar(string fuck) {
           test = fuck;
       }
       string getTest(){
           return test;
       }
       const string& getTest2(){
           return test;
       }

}


Вот с чем =)
(sdk @ Dec 15 2006, в 04:28) писал(а):std::string использует copy-on-write, так что строка будет копироваться только если ты чего-нибудь запишешь во вновь созданную копию.

Ну слава богу...=)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение elide »

Не-не, elide не путай товарища! biggrin.gif
std::string использует copy-on-write, так что строка будет копироваться только если ты чего-нибудь запишешь во вновь созданную копию.
хм... так я ро это ничего и не говорил... но сама string-то скопируется (: это лежащий в ее основе char* будет указывать не на копию, а на оригинал, но ведь все остальное-то скопируется (:
слава роботам!
Спасибо сказали:
ToniX
Сообщения: 11

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение ToniX »

std::string может использовать реализацию на основе подсчета ссылок, а может и не использовать ее. В стандарте просто допускается такая возможность для std::string (в отличие от остальных контейнеров STL, которые обязаны копироваться полностью).

Что касается возвращения по константной ссылке... это потенциально опасно:

Код: Выделить всё

FooBar *p = new FooBar("hello");
const string &test = p->getTest2();
delete p;
cout << test << endl; // на что ссылается test????

Возвращать лучше по значению, тем более, что string обычно под это оптимизирован...
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение Ballantre »

Также проагитирую за возврат переменной по значению, а не по константной ссылке. Ну, во - первых возвращать по ссылке локальные переменные не есть гуд - большинство компиляторов сразу ввдаст на это warning message. Проще вернуть по значению, тем более, string, как замечалось выше, под это и заточен ( это вам не char* ). А уж по поводу константной ссылки... Если в дальнейщем вам возвращенное значение придется обрабатывать, то это может создать дополнительные трудности.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали:
Аватара пользователя
pento
Сообщения: 403
ОС: Fedora 10

Re: [С++] Поясните механизм возврата значения из метода класса по const ссылке?

Сообщение pento »

Всем большое спасибо!
Спасибо сказали: