Russian Qt Forum
Ноябрь 24, 2024, 00:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: C++ переменные  (Прочитано 9342 раз)
Yuriy
Гость
« : Август 26, 2011, 00:52 »

Извиняюсь конечно за столь глупый вопрос, но на протяжении последних 2-х лет я так и не уловил, как лучше объявить константный тип, например:
Код:
const QString &aDeleteGroupID = "DELETE FROM TGroups WHERE GrID = '%1';";
или так:
Код:
const QString aDeleteGroupID = "DELETE FROM TGroups WHERE GrID = '%1';";
Понимаю что при вызове функции указатели жизненно необходимы, а как с константами внутри класса ?
Приношу еще раз свои извинения за туфтологию, но хотелось бы узнать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Август 26, 2011, 03:59 »

определённо второй вариант, только значение присваивать лучше в cpp-файле
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Yuriy
Гость
« Ответ #2 : Август 26, 2011, 04:20 »

интересно... а если я запишу вот так:
Код:
const QString aDeleteGroupID("DELETE FROM TGroups WHERE GrID = '%1';");
это не будет тем же самым, что и первый вариант с использованием &

Я так понимаю, что если в аргументах функции я указываю параметр const type&, тогда функция получает ссылку на участок памяти, не создавая заново эти переменные, не создавая стек параметров по эти переменные и т.д.
А во втором случае по-моему, сначала создается переменная QString, инициализируется, затем рассчитывается вторая половина записи, потом первой присваивается вторая и это на пару тактов больше чем & или нет Непонимающий?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 26, 2011, 07:30 »

Если Type имеет конструктор Type (SomeType), то
Type t (someType) и Type t = someType идентичны.

А первый вариант неверен.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 26, 2011, 09:52 »

Я так понимаю, что если в аргументах функции я указываю параметр const type&, тогда функция получает ссылку на участок памяти, не создавая заново эти переменные, не создавая стек параметров по эти переменные и т.д.
Нет. Сначала создается безымянная QString (вызывается конструктор QString( const char *)), а потом ее адрес присваивается ссылке aDeleteGroupID. Это не ошибка но будет работать для глобальных переменных, а напр вот так получите по ушам
Код
C++ (Qt)
const QString & GetName( void )
{
const QString & name = "abc";
return name;
}
 
Безымянная QString разрушена, возвращена invalid ссылка

А во втором случае по-моему, сначала создается переменная QString, инициализируется, затем рассчитывается вторая половина записи, потом первой присваивается вторая и это на пару тактов больше чем & или нет Непонимающий?
Если переменная объявлена и присваивается - то вызывается конструктор
Код
C++ (Qt)
QString s1;
s1 = "123";       // здесь оператор присваивания
QString s2 = "123";  // а здесь конструктор QString(const char *)
 
Для POD типов разницы нет

Итого: первый вариант = ненужные выкрутасы
« Последнее редактирование: Август 26, 2011, 10:20 от Igors » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 26, 2011, 10:07 »

Разве QString(const char *) - конструктор копирования? Это обычный конструктор.
QString s2 = s1 - вот копирующий конструктор.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 26, 2011, 10:22 »

Разве QString(const char *) - конструктор копирования? Это обычный конструктор.
QString s2 = s1 - вот копирующий конструктор.
Верно, исправил - вызывается "подходящий" конструктор (не обязательно копирования)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Август 26, 2011, 10:38 »

А мне больше нравится вариант:
const QString aDeleteGroupID = "DELETE FROM TGroups WHERE GrID = '%1';";
Как-то более красиво и удобно. Но это все сугубо дело личных предпочтений. Минус в том, что в случае конструктора explicit с двумя параметрами, где второй дефолтный, так уже не сделать.
« Последнее редактирование: Август 26, 2011, 10:41 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Август 26, 2011, 14:35 »

омг, глобал статик не-поды
Записан
brankovic
Гость
« Ответ #9 : Август 26, 2011, 14:47 »

омг, глобал статик не-поды

омг, глобал статик
Записан
Yuriy
Гость
« Ответ #10 : Август 26, 2011, 16:57 »

Хорошо, тогда такая ситтуация: создаю неимоверно важную функцию с переменным числом параметров:
Код:
bool MyModel::haveValuesAtRow(const int aRow,...) const
{
//aRow - номер строки для поиска
//а далее идут номера столбцов, которые будут игнорироваться при поиске
QVector<int> aIgnoredColumns;

   va_list ap;
   int arg;
   va_start(ap, aRow);
   while ((arg = va_arg(ap,int)) != -1) {
      aIgnoredColumns.append(arg);
   }
   va_end(ap);
   
for (int i = 0; i < columnCount(); ++i)
{
    if (aIgnoredColumns.contains(i)) continue;
    if (!data(index(aRow,i),Qt::EditRole).toString().isEmpty()) return true;
}

return false;
}

Если я запишу в объявлении функции:
Код:
bool MyModel::haveValuesAtRow(const int &aRow,...) const
тогда получается интересная ситтуация!

Под Debian GCC - работает как и прежде, под nmake в список параметров попадает мусор из памяти, вместо переданных 5-10 значений я имею тысячу, в виде int(!) и так до тех пор , пока случайно не наткнусь на int = -1.

Это значит, что под Visual C++ действительно работают константные указатели и переменные не создаются заново, поэтому если первым параметром будет const &type то он и перебросит на участок памяти, где собственно и заложен этот const

А если использовать GCC, то возникают сомнения в работоспособности const указателей в аргументах функций. Судя по этим экспериментам он создает заново эти параметры и заново выделяет под них память.
Записан
Yuriy
Гость
« Ответ #11 : Август 26, 2011, 17:05 »

Млин, не могу найти кнопку "Спасибо"
Поэтому, Пантер и Igors, спасибо за Ваши ответы. Они достаточно обоснованные и мне бы хотелось услышать еще Ваше мнение.
Записан
Yuriy
Гость
« Ответ #12 : Август 26, 2011, 17:19 »

Использую активно библиотеки OpenCascade и там очень часто встречаю случай:
Код:
const type &SomeType = ....
вот как раз в этом самом SomeType в конструкторе заложена масса операций, например, если это линия, то создается тело, ему присваются аттрибуты, цвет и т.д.
Поэтому я думаю что при использовании &SomeType игнорируется базовая инициализация. Создается константная переменная со значением которое следует за знаком =
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Август 26, 2011, 18:48 »

[не по теме]
Не используй функции с переменным числом параметров.
[/не по теме]
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Yuriy
Гость
« Ответ #14 : Август 26, 2011, 18:53 »

ПОЧЕМУ так жестоко ?? Я конечно понимаю что это своеобразный "костыль", но порой удобно !
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.