![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
kalomboqt |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.12.2008 Репутация: нет Всего: нет |
Начну со следующего, мне была непонятна конструкция
Заинтересовал параметр функции. Вроде как передается ссылка, но при этом константа, в итоге все равно изменять нельзя. Пришел к выводу, что это тоже самое было бы, если бы мы сделали параметр QString fileName, только памяти расходовалось бы больше. Правильны ли мои рассуждения, можете ли вы что-нибудь добавить? Теперь далее, приняв за истину свои рассуждения начал писать свои функции. Например
Вот и вопрос назрел. Мне так кажется, что я ерундой тут занимаюсь, нужно было объявлять параметром QString str, внутри функции колдовать уже над str и возвращать её же. Или всё-таки лучше использовать const? |
||||
|
|||||
pan2004 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Почти. Подобное используется очень часто, когда в функцию надо передать типы посложнее int. По простому, такой ход устраняет создание временного объекта, весьма дорогую операцию, особенно для разнообразных векторов, деревьев и строк
А по другому нельзя сделать? И далеко не все функции требуют этого. Хотя да, возможно передача QString напрямую была бы тут лучше, но ненамного(затраты на создание и передачу указателя == ссылки ничто по сравнению с затратами на копирование строк). Хотя надо напомнить, что Qt использует здесь Copy on write алгоритм - строка будет скопирована только тогда, когда попытаешься изменить result |
||||
|
|||||
kalomboqt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.12.2008 Репутация: нет Всего: нет |
Ну вот я и хотел узнать можно ли по другому сделать=) Для определенности пусть нужно будет сделать следующее: написать функцию, которая бы из строки формул получала строку переменных. Переменной является либо одна латинская буква, либо две латинские буквы, либо первая буква, вторая цифра (естественно код для это писать не нужно, это я так для полноты картины написал). Вот как бы ты поступил в такой ситуации? QString str? const QString &str? Или что-то совсем другое?) |
|||
|
||||
ISergeyN |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: нет Всего: 2 |
здесь в функции посто запрещается изменять "fileName". тоесть, в пример у тебя есть некий класс "Test"который содержит даные и тебе их надо передать в функцию но при етом нельзя изменить.
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Сам говоришь, что есть входная строка и результат - итого две. Входная чтоб не менялась и не тратились на нее ресурсы (да и чтоб не сбивать программиста) лучше передавать как const&. |
|||
|
||||
ParaPik |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Случайно у кого-нибудь нет статейки по поводу составления функций такого плана:
Что аналогично данной записи:
|
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
что именно интересует?
можно только сказать, что второй вариант предпочтительнее |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Второй вариант безусловно предпочтительнее. Но как я читал, компилятор второй вариант переводит в первый. Ну, и я хотел бы научиться писать объявления функции в первом варианте.
Это сообщение отредактировал(а) ParaPik - 10.1.2009, 12:21 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
никто никого не переводит, второй вариант является первым. typedef обьявляет алиасы, не более того. |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
По поводу перевода я прочитал в книге Дьюхэрста. Он между прочим написал 2 компилятора для C++. И стаж работы более 10 лет. Так что я не думаю, что он бред написал.
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ParaPik, он так написал, чтобы понятней было.
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Но тем не менее, откуда вообще взялась тогда эта запутанная конструкция?
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Ну, если нет информации на мой вопрос, так и скажите. Что толку отмалчиваться?
|
|||
|
||||
pan2004 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Что значит "откуда"? Взбрела она кому-то в голову, вот и взялась ![]()
и вообще, это не функция, а указатель на функцию, которая принимает в качестве параметра в свою очередь указатель на функцию. И поэтому данный код следующему не идентичен
|
||||
|
|||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
А вот возьми и напиши в компиляторе. Я сам удивился, когда увидел результат.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |