С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
#1

No init for const! - C++

23.07.2015, 10:21. Просмотров 616. Ответов 21
Метки нет (Все метки)

Доброе утро, котаны!
Вопрос - в джаве есть возможность сделать такую штуку
Java
1
2
final boolean someBool;
someBool  = true;
То есть объявить константу, а потом её инициализировать. Правда, только один раз. В плюсах такое не скомпилиться.
C++
1
2
3
4
5
6
7
int main()
{
    const int temp;
    std::cin >> temp;
 
    system("pause>>null");
}
Чистый интерес - возможно ли как-то это обойти? То есть, объявить константу не заинитив?
Не спрашивайте для чего это нужно. Наверное ни для чего. Просто интерес.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 10:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос No init for const! (C++):

Lambda init capture by const reference - C++
Всем привет. Почему не получается добиться следующего поведения: auto main() -> int { int ival = 0; () { // Need...

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start->next;} return c; } Функция...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

21
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,014
Завершенные тесты: 1
23.07.2015, 11:00 #2
В классах можно
C++
1
2
3
4
5
6
7
8
9
10
struct A
{
    const int n;
    A(int n0):n(n0){}
};
int main()
{
  A a(3);
  return 0;
}
2
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
23.07.2015, 11:04  [ТС] #3
zss, спасибо за ответ!
А если не в классе?
0
S_el
2113 / 1633 / 308
Регистрация: 15.12.2013
Сообщений: 6,401
23.07.2015, 11:09 #4
Цитата Сообщение от Тамика Посмотреть сообщение
возможно ли как-то это обойти?
нет,так как в Java делать нельзя.
1
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
23.07.2015, 11:14  [ТС] #5
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тамика, это можно объявить в классе и инициализировать в списке инициализации
Хм... Ну это то, про что говорил zss, я правильно поняла?

Добавлено через 2 минуты
Цитата Сообщение от S_el Посмотреть сообщение
нет,так как в Java делать нельзя.
Ну да, оно не компилиться. Потому интересно, есть ли какие-то хитрые варианты.
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
23.07.2015, 11:14 #6
Ну как пример еще через объединение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
  union u_u
    {
    u_u()
      :c(0)
      {}
    int i;
    const int c;
    } u;
 
    u.i = 666;
 
    cout << u.c << endl;
P.S. Странно, почему-то const_cast не работает:
C++
1
2
3
4
5
6
7
8
9
    const int link_temp(0);
    int *ptemp;
    int val_temp;
 
    std::cin >> val_temp;
 
 
    ptemp = const_cast< int* > ( &link_temp );
    *ptemp = val_temp;
2
S_el
2113 / 1633 / 308
Регистрация: 15.12.2013
Сообщений: 6,401
23.07.2015, 11:21 #7
Цитата Сообщение от Тамика Посмотреть сообщение
Ну да, оно не компилиться. Потому интересно, есть ли какие-то хитрые варианты.
Насколько мне известно так делать нельзя. И предложенные выше вариант тоже не обходит это правило(инициализируется в момент объявления).
0
rikimaru2013
23.07.2015, 11:25
  #8

Не по теме:

с union конечно грязь грязью, но обошёл же ж как и требовалось ТСом.

0
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
23.07.2015, 11:29  [ТС] #9
SatanaXIII, интересный вариант. Но! Ты всё равно инициализируешь изначально константу. Просто даешь возможность её менять.
Кстати, у меня второй код работает... Почему ты думал, что не работает?
И ещё вопросец ко второй части: если это будет рид-онли память - не будет ли креша?..
0
S_el
23.07.2015, 11:32
  #10

Не по теме:

Цитата Сообщение от Тамика Посмотреть сообщение
Просто даешь возможность её менять.
Там меняется не константа

0
Тамика
23.07.2015, 11:33  [ТС]
  #11

Не по теме:

Цитата Сообщение от S_el Посмотреть сообщение
Там меняется не константа
Ну да, точно. Но для себя это запомню.

0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
23.07.2015, 11:34 #12
SatanaXIII, изменение константы времени компиляции - UB.

В классе же просто "переменная изменение которой не желательно", а не константа.
0
rikimaru2013
C++ Game Dev
2440 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
23.07.2015, 11:36 #13
Цитата Сообщение от Croessmah Посмотреть сообщение
В классе же просто "переменная изменение которой не желательно", а не константа.
Информация с стандарта?
0
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
23.07.2015, 11:36  [ТС] #14
А какие проблемы могут быть в таком случае?
C++
1
2
3
4
5
6
7
8
9
10
void change_me(const int& a)
{
  const_cast<int&>(a) = 3;
}
 
int main()
{
  int a = 5;
  change_me(a);
}
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 1
23.07.2015, 11:36 #15
Цитата Сообщение от Тамика Посмотреть сообщение
всё равно инициализируешь изначально константу
Без этого, к сожалению, нельзя.

Цитата Сообщение от Тамика Посмотреть сообщение
Кстати, у меня второй код работает... Почему ты думал, что не работает?
Да я про свой. Забыл, что const_cast не снимает константность с объекта, созданного константным.


Вот нашел чего интересного: [Задача] const volatile
0
23.07.2015, 11:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 11:36
Привет! Вот еще темы с ответами:

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,&quot;acc.dll&quot;,RT_RCDATA); if(!hRes){ } HGLOBAL...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+' - C++
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'? ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.