Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции, параметры, вопросы. 
:(
    Опции темы
kalomboqt
Дата 27.12.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.12.2008

Репутация: нет
Всего: нет



Начну со следующего, мне была непонятна конструкция 
Код

void openFile(const QString &fileName)

Заинтересовал параметр функции. Вроде как передается ссылка, но при этом константа, в итоге все равно изменять нельзя. Пришел к выводу, что это тоже самое было бы, если бы мы сделали параметр QString fileName, только памяти расходовалось бы больше. Правильны ли мои рассуждения, можете ли вы что-нибудь добавить?

Теперь далее, приняв за истину свои рассуждения начал писать свои функции. Например 
Код

QString getVariables(const QString &str)
{
         QString result = str; // В итоге приходится всё равно создавать копию
         // ...
        // тут я что-то делаю с result
         //.....
         return result; // ну и возвращаю её
}


Вот и вопрос назрел. Мне так кажется, что я ерундой тут занимаюсь, нужно было объявлять параметром QString str, внутри функции колдовать уже над str и возвращать её же. Или всё-таки лучше использовать const?
PM MAIL   Вверх
pan2004
Дата 27.12.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



Цитата(kalomboqt @  27.12.2008,  21:19 Найти цитируемый пост)
Правильны ли мои рассуждения, можете ли вы что-нибудь добавить?

Почти. Подобное используется очень часто, когда в функцию надо передать типы посложнее int. По простому, такой ход устраняет создание временного объекта, весьма дорогую операцию, особенно для разнообразных векторов, деревьев и строк
Цитата(kalomboqt @  27.12.2008,  21:19 Найти цитируемый пост)
QString result = str; // В итоге приходится всё равно создавать копию

А по другому нельзя сделать? И далеко не все функции требуют этого. Хотя да, возможно передача QString напрямую была бы тут лучше, но ненамного(затраты на создание и передачу указателя == ссылки ничто по сравнению с затратами на копирование строк). Хотя надо напомнить, что Qt использует здесь Copy on write алгоритм - строка будет скопирована только тогда, когда попытаешься изменить result


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
kalomboqt
Дата 27.12.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.12.2008

Репутация: нет
Всего: нет



Цитата(pan2004 @ 27.12.2008,  22:09)
А по другому нельзя сделать? И далеко не все функции требуют этого. Хотя да, возможно передача QString напрямую была бы тут лучше, но ненамного(затраты на создание и передачу указателя == ссылки ничто по сравнению с затратами на копирование строк). Хотя надо напомнить, что Qt использует здесь Copy on write алгоритм - строка будет скопирована только тогда, когда попытаешься изменить result

Ну вот я и хотел узнать можно ли по другому сделать=) Для определенности пусть нужно будет сделать следующее: написать функцию, которая бы из строки формул получала строку переменных. Переменной является либо одна латинская буква, либо две латинские буквы, либо первая буква, вторая цифра (естественно код для это писать не нужно, это я так для полноты картины написал). Вот как бы ты поступил в такой ситуации? QString str? const QString &str? Или что-то совсем другое?)
PM MAIL   Вверх
ISergeyN
Дата 28.12.2008, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: нет
Всего: 2



Цитата

void openFile(const QString &fileName)

здесь в функции посто запрещается изменять "fileName".
тоесть, в пример у тебя есть некий класс "Test"который содержит даные и тебе их надо передать в функцию но при етом нельзя изменить. 
Код

#include <iostream>
using namespace std;

class Test
{
public:
    int x;
    int y;
};
void test(const Test &q)
{
    cout<<q.x<<endl
        <<q.y<<endl;
    //q.x = 10; // error
    //q.y = 4;  // error
}
int main()
{
    Test q;
    q.x = 1;
    q.y = 2;
    test(q);
    return 0;
}

PM MAIL Skype   Вверх
mes
Дата 28.12.2008, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(kalomboqt @  27.12.2008,  22:35 Найти цитируемый пост)
, которая бы из строки формул получала строку переменных

Сам говоришь, что есть входная строка и результат - итого две. Входная чтоб не менялась и не тратились на нее ресурсы (да и чтоб не сбивать программиста) лучше передавать как const&.



--------------------
PM MAIL WWW   Вверх
ParaPik
Дата 9.1.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Случайно у кого-нибудь нет статейки по поводу составления функций такого плана:
Код

void (*set_new_handler(void(*)()))();

Что аналогично данной записи:
Код

typedef void (*new_handler)();
new_handler set_new_handler(new_handler);

PM MAIL   Вверх
Alek86
Дата 9.1.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



что именно интересует?
можно только сказать, что второй вариант предпочтительнее


--------------------
user posted image    user posted image
PM MAIL   Вверх
ParaPik
Дата 10.1.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) ParaPik - 10.1.2009, 12:21
PM MAIL   Вверх
vinter
Дата 10.1.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(ParaPik @  10.1.2009,  13:20 Найти цитируемый пост)
Но как я читал, компилятор второй вариант переводит в первый

никто никого не переводит, второй вариант является первым. typedef обьявляет алиасы, не более того.


--------------------
Мой блог
PM MAIL WWW   Вверх
ParaPik
Дата 10.1.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



По поводу перевода я прочитал в книге Дьюхэрста. Он между прочим написал 2 компилятора для C++. И стаж работы более 10 лет. Так что я не думаю, что он бред написал.
PM MAIL   Вверх
vinter
Дата 10.1.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



ParaPik, он так написал, чтобы понятней было.


--------------------
Мой блог
PM MAIL WWW   Вверх
ParaPik
Дата 11.1.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Но тем не менее, откуда вообще взялась тогда эта запутанная конструкция?
PM MAIL   Вверх
ParaPik
Дата 15.1.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Ну, если нет информации на мой вопрос, так и скажите. Что толку отмалчиваться?
PM MAIL   Вверх
pan2004
Дата 15.1.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



Цитата(ParaPik @  11.1.2009,  09:27 Найти цитируемый пост)
откуда вообще взялась тогда эта запутанная конструкция

Что значит "откуда"? Взбрела она кому-то в голову, вот и взялась smile 
Код

void (*set_new_handler(void(*)()))();

и вообще, это не функция, а указатель на функцию, которая принимает в качестве параметра в свою очередь указатель на функцию. И поэтому данный код следующему не идентичен
Код

typedef void (*new_handler)();
new_handler set_new_handler(new_handler);



--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
ParaPik
Дата 16.1.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



А вот возьми и напиши в компиляторе. Я сам удивился, когда увидел результат.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0965 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.