powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем копия обьекта возращенного из функции присваивается ссылке?
17 сообщений из 17, страница 1 из 1
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919872
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Часто встречаю такой код в обычный методах класа:
Код: plaintext
1.
const QString &plainText = ui.textEdit->toPlainText();

обьясните зачем присваевать ссылке копию?А не просто написать
Код: plaintext
1.
const QString plainText = ui.textEdit->toPlainText();

И еще вопрос зачем в cpp файле пишут такое
Код: plaintext
1.
namespace { const int maxLenght = 1; }

,зачем оборачивать в безымянный немспейс в cpp файле мы все равно его не увидим, и какая разница в записи
Код: plaintext
1.
const int maxLenght = 1;  и static const int maxLenght = 1;

что лучше использовать и в каких случаях?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919895
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987,

1) Константная ссылка позволяет избежать фактического копирования возвращаемого объекта если функция возвращает ссылку.
Одновременно, если ф-я возвращает копию, то константная ссылка указывает компилятору хранить временное значение пока ссылка не выйдет из области видимости.
Т.е. это позволяет не задумываться возвращается ли ссылка или сам объект и при этом получать максимально быстрый код и обходиться без утечек памяти.

2) анонимный namespace - это более общий случай static.
В большинстве случаев - взаимозаменяемы (если не рассматривать такие детали как вложенные неймспейсы и аргументозависимый поиск неквалифицированных функций).
Константы неявно создаются как static поэтому можно не указывать static
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919905
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyKatamaran1987,
1) Константная ссылка позволяет избежать фактического копирования возвращаемого объекта если функция возвращает ссылку.
Функция возращает не ссылку зачем тогда присваивать ссылке?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919920
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyKatamaran1987,
это позволяет не задумываться возвращается ли ссылка или сам объект и при этом получать максимально быстрый код и обходиться без утечек памяти.Это какие еще утечки const QString plainText = ui.textEdit->toPlainText(); в этом коде?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919925
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987,

Я же написал - если возвращается ссылка, то копировать во временный объект нет никакого смысла.
Во многих АПИ не описано что именно будет возвращаться - ссылка или объект, чтобы у имплементоров библиотеки была свобода маневра для оптимизаций.
Утечки могут быть если вы не константные ссылки будете использовать.
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919929
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyKatamaran1987,
Утечки могут быть если вы не константные ссылки будете использовать.Не понимаю можно пример?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919932
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще насчет разницы между анонимным неймспейсом и статик.
Объекты объявленные в анонимном неймспейсе видны за пределами единицы трансляции (под уникальными именами, но видны), а объекты объявленные статик - за пределами не видны вообще.
С практической точки зрения это должно иметь значение при инстанцировании шаблонов, но я на практике никогда не сталкивался с проблемами из-за статиков.
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919950
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyKatamaran1987,
Во многих АПИ не описано что именно будет возвращаться - ссылка или объект, чтобы у имплементоров библиотеки была свобода маневра для оптимизаций.
Другими словами этот код является универсальным и быстрым const QString &plainText = ui.textEdit->toPlainText();?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919952
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987Anatoly MoskovskyKatamaran1987,
Утечки могут быть если вы не константные ссылки будете использовать.Не понимаю можно пример?
Некоторые компиляторы позволяли временные значения присваивать в неконстантные ссылки и не следили за временем жизни.
Пример не могу привести, под рукой нет того старья.
Впрочем я допускаю что про утечки я неверно помню, и может их и нет.
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919953
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987Другими словами этот код является универсальным и быстрым const QString &plainText = ui.textEdit->toPlainText();?
да
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37919977
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987,

Проще говоря, короткая жизнь временной переменной которая возвращается из функции немного продлевается, а именно до конца жизни самой константной ссылки. Это явно указанный стандартом прием продления жизни временных объектов. Это нужно чтобы избежать накладных расходов на создание копии временного объекта.

Если бы его не было, а был вариант указанный вами, тогда временный объект полученный из функции, копировался бы в целевой объект вызовом конструктора копирования, затем после окончания присваивания удалялся бы, вызывался деструктор временного объекта, освобождалась бы память занятая им, а это куча накладных расходов. А с константной ссылкой всего этого не происходит, временный объект "зацепляется" ссылкой и не "умирает" пока она не выходит из области своей видимости, и вы фактически работаете с возвращенным временным объектом.

Но все это ветряные мельницы, и поэтому я бы не стал это называть универсальным и быстрым способом, так как обычно нужно запоминать то, что функция вернула, и рано или поздно придется все же скопировать объект. Кроме того для QString это совсем небольшие константные расходы, так как это copy-on-change объект, и копирования не произойдет. Кроме того компилятор может оптимизировать возвращаемое значение, и без константной ссылки, и копирования на самом деле чаще всего не будет вовсе. Кроме того скоро все перейдет на move семантику, и эта "фича" и вовсе может кануть в лету.

Anatoly Moskovsky,

еще unnamed namespace-ы очень удобны для упрятывания в них вспомогательных типов, функций, объектов (они конечно чаще признак плохого дизайна, но все же).
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37920120
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/16/2012 07:00 PM, Katamaran1987 wrote:

> Функция возращает не ссылку зачем тогда присваивать ссылке?

А почему бы и нет ? Собственно, что тебя смущает ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #37920327
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivOn 08/16/2012 07:00 PM, Katamaran1987 wrote:

> Функция возращает не ссылку зачем тогда присваивать ссылке?

А почему бы и нет ? Собственно, что тебя смущает ?
Ну я почему то считал если функция возращает ссылку тогда и принимать я должен ссылку, и соответственно если возращает копию то и принимать копию.
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #38097283
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyКонстанты неявно создаются как static поэтому можно не указывать static Я правильно понял?
Код: plaintext
1.
2.
3.
4.
namespace detail
{
const int max= 128;// == static const int max= 128;
}

В cpp файле и в h?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #38097326
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987Anatoly MoskovskyКонстанты неявно создаются как static поэтому можно не указывать static Я правильно понял?
Код: plaintext
1.
2.
3.
4.
namespace detail
{
const int max= 128;// == static const int max= 128;
}

В cpp файле и в h?

Это - да:
Код: plaintext
1.
const int max= 128;// == static const int max= 128;


Единственное, это относится только к нелокальным константам.
Локальные (объявленные в теле функции) не делаются статическими без явного указания.

Я не понял вопроса "В cpp файле и в h?"

Между cpp и h нет никакой разницы, кроме того что h обычно включаются разными cpp.
В этом случае константа объявленная в таком хедере в каждой единице трансляции будет физически отдельной "переменной" (это относится к любым глобальным статическим переменным).
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #38097343
Katamaran1987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЯ не понял вопроса "В cpp файле и в h?"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//h.file
namespace detail
{
const int max= 128;// == static const int max= 128;
}
в h файле если обьявленна как статик то она не видна в других модулях.если без статика то она видна, и может быть обьявленна как extern чтобы избежать ошибок линкера(мульти дефенишен) ну и соответсвенно гдето надо будет ее определить.
//cpp.file
namespace detail
{
const int max= 128;// == static const int max= 128;
}
//переменная видна только в этом cpp файле и все.


Правильно я считаю?
...
Рейтинг: 0 / 0
Зачем копия обьекта возращенного из функции присваивается ссылке?
    #38097446
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katamaran1987Правильно я считаю?
Нет. Я ж выше написал - константы неявно статические. Поэтому дублирования при связывании не будет. И поэтому же через extern нельзя импортировать константу объявленную в другой единице трансляции.
Импорт констант делается через объявление их в хедере и его включение.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем копия обьекта возращенного из функции присваивается ссылке?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]