Форум программистов, компьютерный форум CyberForum.ru

No init for const! - C++

Восстановить пароль Регистрация
 
 
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
23.07.2015, 10:21     No init for const! #1
Доброе утро, котаны!
Вопрос - в джаве есть возможность сделать такую штуку
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");
}
Чистый интерес - возможно ли как-то это обойти? То есть, объявить константу не заинитив?
Не спрашивайте для чего это нужно. Наверное ни для чего. Просто интерес.)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
23.07.2015, 11:00     No init for const! #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;
}
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
23.07.2015, 11:04  [ТС]     No init for const! #3
zss, спасибо за ответ!
А если не в классе?
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,911
23.07.2015, 11:09     No init for const! #4
Цитата Сообщение от Тамика Посмотреть сообщение
возможно ли как-то это обойти?
нет,так как в Java делать нельзя.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
23.07.2015, 11:14  [ТС]     No init for const! #5
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тамика, это можно объявить в классе и инициализировать в списке инициализации
Хм... Ну это то, про что говорил zss, я правильно поняла?

Добавлено через 2 минуты
Цитата Сообщение от S_el Посмотреть сообщение
нет,так как в Java делать нельзя.
Ну да, оно не компилиться. Потому интересно, есть ли какие-то хитрые варианты.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
23.07.2015, 11:14     No init for const! #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;
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,911
23.07.2015, 11:21     No init for const! #7
Цитата Сообщение от Тамика Посмотреть сообщение
Ну да, оно не компилиться. Потому интересно, есть ли какие-то хитрые варианты.
Насколько мне известно так делать нельзя. И предложенные выше вариант тоже не обходит это правило(инициализируется в момент объявления).
rikimaru2013
23.07.2015, 11:25
  #8

Не по теме:

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

Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
23.07.2015, 11:29  [ТС]     No init for const! #9
SatanaXIII, интересный вариант. Но! Ты всё равно инициализируешь изначально константу. Просто даешь возможность её менять.
Кстати, у меня второй код работает... Почему ты думал, что не работает?
И ещё вопросец ко второй части: если это будет рид-онли память - не будет ли креша?..
S_el
23.07.2015, 11:32
  #10

Не по теме:

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

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

Не по теме:

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

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
23.07.2015, 11:34     No init for const! #12
SatanaXIII, изменение константы времени компиляции - UB.

В классе же просто "переменная изменение которой не желательно", а не константа.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,223
23.07.2015, 11:36     No init for const! #13
Цитата Сообщение от Croessmah Посмотреть сообщение
В классе же просто "переменная изменение которой не желательно", а не константа.
Информация с стандарта?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
23.07.2015, 11:36  [ТС]     No init for const! #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);
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
23.07.2015, 11:36     No init for const! #15
Цитата Сообщение от Тамика Посмотреть сообщение
всё равно инициализируешь изначально константу
Без этого, к сожалению, нельзя.

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


Вот нашел чего интересного: [Задача] const volatile
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
23.07.2015, 11:39     No init for const! #16
Цитата Сообщение от Тамика Посмотреть сообщение
Хм... Ну это то, про что говорил zss, я правильно поняла?
абсолютно. Вообще обмануть компилятор можно, но если честно то нельзя инициализировать константы и ссылки вне объявления. В классе и со списком, - можно.
А ошибок наделать легко и без хаков. Вот древняя история
Цитата Сообщение от из упанишад
После шести часов тяжелейших мучений он нашёл ошибку. Она состояла в том что при копипасте были перепутаны 2 переменные с именами длинными и отличающимися одним символом!
"Слава те господи!" - тихо пробормотал он. Монитор закачался, экран треснул, а системный блок ещё долго эхом отражал :"твою мать..., твою мать..., твою мать..."

Но если очень хочется то можно.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
23.07.2015, 11:41     No init for const! #17
Информация с стандарта?
const - просто квалификатор, который показывает что переменную менять бы не надо, он не гарантирует то, что сами данные константны. Для примера:
C++
1
2
3
4
void foo ( const int & x )
{
    //работаем с x
}
Для функции переменная x - просто "неизменяемая переменная", которая может быть константой, а может и не быть.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,223
23.07.2015, 11:42     No init for const! #18
Цитата Сообщение от Тамика Посмотреть сообщение
А какие проблемы могут быть в таком случае?
Кажись никаких, а вот
C++
1
2
3
4
5
6
7
8
9
10
void change_me(const int& a)
{
  const_cast<int&>(a) = 3;
}
 
int main()
{
 const int a = 5;
  change_me(a);
}
Тут UB - компилятор мог закэшировать число 5, и он в нужный момент может не ожидать, что там не 5 )))))
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
23.07.2015, 11:42     No init for const! #19
Типа того:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct s_s
{
    const int const_val;
    s_s()
      :const_val(0)
      {}
} s;
 
int main()
{
  int *ptemp;
  int val_temp;
 
 
  std::cin >> val_temp;
 
 
  ptemp = const_cast< int* > ( &s.const_val );
  *ptemp = val_temp;
 
 
  cout << s.const_val;
 
  return 0;
}
upd
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct s_s
{
    const int const_val;
    s_s()
      :const_val(0)
      {}
} s;
 
int main()
{
  int *ptemp = const_cast< int* > ( &s.const_val );
 
  std::cin >> *ptemp;
 
  cout << s.const_val;
 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 12:04     No init for const!
Еще ссылки по теме:

C++ error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'
C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
23.07.2015, 12:04     No init for const! #20
Цитата Сообщение от Тамика Посмотреть сообщение
А какие проблемы могут быть в таком случае?
Ну, собственно
7.1.6.1

2. [ Note: Declaring a variable const can affect its linkage (7.1.1) and its usability in constant expressions (5.20). As described in 8.5, the definition of an object or subobject of const-qualified type must specify an initializer or be subject to default-initialization. —end note ]

3. A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path. [ Note: Cv-qualifiers are supported by the type system so that they cannot be subverted without casting (5.2.11). —end note ]
Yandex
Объявления
23.07.2015, 12:04     No init for const!
Ответ Создать тему
Опции темы

Текущее время: 04:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru