crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Константы в аргументах функций
RazrFalcon
  опции профиля:
сообщение 28.9.2011, 12:38
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пример:
void setName(const QString &text);
// и
void setName(QString text);

1) Я так понимаю, что в первом случае я не смогу изменить переменную text в самой функции, да?
2) Какой вариант предпочтительней?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 28.9.2011, 13:06
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


>>1) Я так понимаю, что в первом случае я не смогу изменить переменную text в самой функции, да?
Проверь

>>2) Какой вариант предпочтительней?
Смотря для чего.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hoRUS
  опции профиля:
сообщение 28.9.2011, 14:35
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 10.7.2008
Из: Москва
Пользователь №: 231

Спасибо сказали: 5 раз(а)




Репутация:   0  


1) а) Передача ссылки на строку, копирования самой строки не производится, но изменить не сможешь, т.к. ссылка константная.
б) Тут бы следовало ждать передачу по значению, т.е. копирование строки, но в Qt есть для QString (и некот. др. классов) механизм "неявного совместного использования" (http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html) - передается ссылка на строку, но если где-то в функции setName() как-то изменить строку, то создастся независимая копия строки, которая будет локальной по отношению к setName(), т.е. все изменения, сделанные над строкой text в setName(), так в setName() и останутся. Этот механизм придуман для возможного увеличения производительности при сохранении семантики копирования по значению - если исходная строка никак не изменяется в функции, то и нефиг ее реально копировать, т.е. передавать по значению - достаточно передать ссылку, результат будет тот же. Если же строка изменяется внутри функции, то (как и требует семантика копирования по значению) - создаем копию данных... Детали реализации этого механизма могут быть другими, но идея такая.
Т.о. оба подхода фактически эквивалентны для QString, если внутри setName() строка не изменяется (хотя, конечно, это все еще зависит и от деталей реализации механизма)


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 20:18