Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126

Размещение констант в классе

09.12.2017, 21:13. Показов 2656. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    
 
    class a {
 
        const int const1 = 100;
        const int const2 = 100;
 
    public:
 
        int get1() { return const1; }
        int get2() { return const2; }
 
    };
Вопрос:

1. Будет ли в каждом экземпляре класса "a" лежать две константы? Или транслятор поймет, что это константы и не будет их располагать в каждом экземпляре класса?

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2017, 21:13
Ответы с готовыми решениями:

Размещение констант(теорет.)
По вашему мнению, где лучше размещать константы 1) Все константы в одном файла(массив или класс не имеет значения) 2) Необходимые...

Правильное размещение констант
Перед тем как создавать тему, погуглил, но нигде ответа не нашел. Вопрос такой: Есть набор констант, которые могут использоваться в...

Размещение констант во flash-памяти AVR?
Уважаемые коллеги! Осваиваю графический экранчик, написал для него в отдельном .h шрифт в виде: #include <avr/pgmsposi.h> ...

29
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
09.12.2017, 21:29
Поймёт.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.12.2017, 21:36
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Будет ли в каждом экземпляре класса "a" лежать две константы?
да.
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
не будет их располагать в каждом экземпляре класса?
нет.
будет.
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
09.12.2017, 22:11
pepsicoca2, используйте static члены
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
09.12.2017, 22:57  [ТС]
Цитата Сообщение от DobroAlex Посмотреть сообщение
используйте static члены

Не хочу static члены. Хочу все в h-файл поместить, а static члены надо в cpp файл выносить.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
нет.
будет.
Очень печально. А зачем он так делает? Это же константы, они все равно не изменяются. А если кто-то начнет их изменять, то тогда и можно и разместить в каждом экземпляре класса. Транслятор же видит, есть присвоение полю, или оно так и остается константой всегда.

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Поймёт.
Так поймет или не поймет? Толпа народу пишет стандарты на С++ уже 30 лет как, и все равно сколько программистов, столько и мнений.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.12.2017, 23:06
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
А зачем он так делает?
а зачем вы пишите код для мемберов класса?

Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Это же константы, они все равно не изменяются.
вы написали код: "хочу два мембера в классе"
а компилятор такой: "да ладна нафиг, не нужны тебе два мембера в классе"

вы это так себе представляете?

Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Транслятор же видит
транслятор не имеет привычки домысливать за программиста,

он делает ровно то, что программист написал,
а не подразумевал.

и если программист описал мембер класса,
значит будет мембер класса.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.12.2017, 23:07
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Не хочу static члены. Хочу все в h-файл поместить, а static члены надо в cpp файл выносить.
Используй static constexpr члены.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.12.2017, 23:13
Цитата Сообщение от Renji Посмотреть сообщение
Используй static constexpr члены.
не нужно.

C++
1
2
3
4
5
6
class a {
    public:
 
        static int get1() noexcept { return 100; }
        static int get2() noexcept { return 200; }
    };
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.12.2017, 23:20
Цитата Сообщение от hoggy Посмотреть сообщение
не нужно.
Особенно, если константа задает размер какого ни будь там массива. Впрочем, с constexpr функциями тоже прокатит.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.12.2017, 23:50
Цитата Сообщение от Renji Посмотреть сообщение
Впрочем, с constexpr функциями тоже прокатит.
зачем использовать передовые, и более сложные технологии,

если доступны более простые, надежные,
которые осилит даже старенький компилятор?

C++
1
2
3
4
5
6
7
8
class a 
{
        enum { const1 = 100 };
        enum { const2 = 100 };
    public:
        static int get1()noexcept { return const1; }
        static int get2()noexcept { return const2; }
};
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 00:00
Цитата Сообщение от hoggy Посмотреть сообщение
зачем использовать передовые, и более сложные технологии,
Что такого передового и сложного в том, чтобы объявить константу константой, а не перечислением? Наоборот, решение через enum - чистой воды костыль.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 00:19
Цитата Сообщение от Renji Посмотреть сообщение
Что такого передового и сложного в том, чтобы объявить константу константой, а не перечислением?
constexpr - передовая технология,
константа вообще не нужна.

Цитата Сообщение от Renji Посмотреть сообщение
решение через enum
православный дедовский способ работы с компалтайм-вычислениями.

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

к тому же,
не увеличивает зазря размер класса.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 00:25
Цитата Сообщение от hoggy Посмотреть сообщение
constexpr - передовая технология,
Шесть лет назад ввели, а оно все еще для кого-то передовое. Нет, я понимаю что у некоторых legacy-код, а компилятор еще с прошлого века не обновлялся. Но в ТЗ то ничего про это сказано не было.
Цитата Сообщение от hoggy Посмотреть сообщение
православный дедовский способ работы с компалтайм-вычислениями.
С такой логикой давайте уж сразу define прадедушки.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 01:33
Цитата Сообщение от Renji Посмотреть сообщение
Шесть лет назад ввели, а оно все еще для кого-то передовое.
для компиляторов.

Цитата Сообщение от Renji Посмотреть сообщение
Но в ТЗ то ничего про это сказано не было.
согласно ТЗ константы здесь вообще не нужны.

Цитата Сообщение от Renji Посмотреть сообщение
С такой логикой давайте уж сразу define прадедушки.
с такой логикой define не годится.
поскольку, дизайн не годится для компалтайм вычислений:
some::value
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 01:49
Цитата Сообщение от hoggy Посмотреть сообщение
согласно ТЗ константы здесь вообще не нужны.
В стартпосте написано именно "константы". А все эти "да нафиг константы, ты их enum/методами/define замени" это уже наши с вами додумки. Как и то что ТС обязательно нужно some::value и не устроит define SOME_VALUE.
Цитата Сообщение от hoggy Посмотреть сообщение
для компиляторов.
Версии минус четыре от текущей, поддержка производителем много лет как прекращена. Вот возьмем тот же gcc - C++11 завезли в четвертой версии. Официальный сайт говорит что поддерживаются только 7.2 и 6.4. Впрочем, пардон, рядом с колонкой "Supported Releases" значится новость о выходе 5.5, но сути это не меняет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 01:58
Цитата Сообщение от Renji Посмотреть сообщение
В стартпосте написано именно "константы"
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Или транслятор поймет, что это константы и не будет их располагать в каждом экземпляре класса?
Цитата Сообщение от Renji Посмотреть сообщение
это уже наши с вами додумки.
решение с енумами - решение, которое гарантирует,
что наличие констант никак не скажется на размере класса.

Цитата Сообщение от Renji Посмотреть сообщение
сути это не меняет.
суть в том, что не нужно ничего усложнять на ровном месте.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 02:04
Цитата Сообщение от hoggy Посмотреть сообщение
решение с енумами - решение, которое гарантирует,
что наличие констант никак не скажется на размере класса.
Равно как и static constexpt. Только в static constexpt написано const и сразу понятно что это константа. А в enum 'этого не написано и его назначение ясно только при знакомстве со старыми костылями.
Цитата Сообщение от hoggy Посмотреть сообщение
суть в том, что не нужно ничего усложнять на ровном месте.
Пока всех усложнений - жалобы на недостаточно продвинутый компилятор. Который стоило бы обновить лет пять тому назад.
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
10.12.2017, 12:49  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
вы написали код: "хочу два мембера в классе"
а компилятор такой: "да ладна нафиг, не нужны тебе два мембера в классе"

Смешно. Напоминает старый анекдот времен ЕС ЭВМ:

- Что такое шедулер?
- Это часть операционки, с которой надо поторговаться о выделении ресурсов.

Добавлено через 6 минут
Цитата Сообщение от Renji Посмотреть сообщение
Пока всех усложнений - жалобы на недостаточно продвинутый компилятор. Который стоило бы обновить лет пять тому назад.

Компилятор обновлять себе дороже. Обратная совместимость не на высоком уровне. Как говорится, не будите спящую собаку. Кроме того, бывает проекты намертво привязанные к компилятору. У меня был проект на 10 лет работы, сделанный на Borland C++ Builder 6.0. С завязками на всю эту VCL library. Никаких там constexpr и в помине не было. И что, прикажете все переделывать из-за того, что в новом трансляторе есть constexpr?

Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Особенно, если константа задает размер какого ни будь там массива.

Кстати да, все началось с желания задать размер массива константой-членом класса.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 13:39
Цитата Сообщение от Renji Посмотреть сообщение
Равно как и static constexpt.
нет. не равно.

статический член класса откушает память до конца работы всей программы.
в отличие от.

Цитата Сообщение от Renji Посмотреть сообщение
Пока всех усложнений - жалобы на недостаточно продвинутый компилятор
нежелание зазря расходовать ресурсы вообще то.
static constexpt кушает память.

Цитата Сообщение от pepsicoca2 Посмотреть сообщение
все началось с желания задать размер массива константой-членом класса.
решение с enum эффективно,
и не обладает недостатками.

другое эффективное решение - define или "магические числа"
содержат известные недостатки.

решение с явными константами не дает профитов.
и кушает память.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 16:24
Цитата Сообщение от hoggy Посмотреть сообщение
статический член класса откушает память до конца работы всей программы.
Значение constexpr константы по определению должно вычисляться на стадии компиляции. Если ваш компилятор не в состоянии заинлайнить константу времени компиляции, выкиньте его на помойку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.12.2017, 16:24
Помогаю со студенческими работами здесь

Массив констант в статическом классе. Как правильно сделать
Добрый день! Есть задача, сделать класс с данными, в котором хранится простой массив с данными и классы, содержащие массивы константных...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! "Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников....

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

В классе инициализировать массив, в классе создать функцию вывода массива на экран
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе инициализировать массив, в классе создать...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru