Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8

Как работает идентификатор const?

25.01.2020, 21:02. Показов 2473. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Вопрос беспокоит. В данный момент я пишу класс исключений и необходимо, чтобы при его инициализации он получал в качестве аргумента константную строку.
Вопрос я решил, подсмотрев в реализацию базового класса в VS. Собственно получившийся код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class framework_error
    : public std::exception
{
public:
    framework_error(char const* const _sErr) : sErr(_sErr) {
    };
    const char* what() 
    {
        return sErr;
    };
private:
    const char* sErr = new char;
};
Вопрос заключается в строке:

C++
1
char const* const _sErr
Почему компилятор воспринимает ее нормально, а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2020, 21:02
Ответы с готовыми решениями:

Как работает const?
Каким образом он защищает данные от изменения ? Т.е. это происходит на этапе компиляции; это закладывается в программу в виде...

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

Код, который проверяет есть ли в регистре идентификатор GUID - как он работает?
Есть код который как бы проверяет есть ли в регистре идентификатор GUID или нет, вот он: hr=HRESULT; CLSID clsid; if ((hr =...

8
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
25.01.2020, 21:06
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
О чем речь вообще? Что такое "отдельно взятый константный указатель или отдельно взятая константная строка"?
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.01.2020, 21:07
Не используй char* с исключениями. Лучше std::string.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.01.2020, 21:08
удалил
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.01.2020, 21:37
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "отдельно взятый константный указатель или отдельно взятая константная строка"?
мои догадки:
C++
1
2
char* const // отдельно взятый константный указатель
char const* // отдельно взятая константная строка
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8
26.01.2020, 01:17  [ТС]
Имеется ввиду нечто вроде такого:

C++
1
2
char const  name
char const* name
В примере, который я предоставил используется и const, и const*
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.01.2020, 21:49
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
Почему компилятор воспринимает ее нормально, а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
Конкретный код выбивший ошибку, конкретный текст ошибки в студию.
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
const char* sErr = new char;
new не нужен.
Цитата Сообщение от New man Посмотреть сообщение
Не используй char* с исключениями. Лучше std::string.
...Чтобы вместо твоего исключения, полетел std::bad_alloc из конструктора std::string.
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8
27.01.2020, 03:48  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Конкретный код выбивший ошибку, конкретный текст ошибки в студию.
C++
1
char const _sErr
E0144 значение типа "char" нельзя использовать для инициализации сущности типа "const char *"
Это ошибка мне понятна, но к сожалению при
C++
1
char const* _sErr
компилятор перестал выдавать ошибку.

Суть все равно, остается та же. Почему подобного рода запись
C++
1
char const* const _sErr
воспринимается компилятором нормально, и помимо прочего данное решение присутствует в реализации класса exception
Пример (vcruntime_exception.h 53 строка):
C++
1
2
  explicit exception(char const* const _Message) noexcept
        : _Data()
Цитата Сообщение от Renji Посмотреть сообщение
new не нужен.
Учел!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.01.2020, 07:20
Лучший ответ Сообщение было отмечено Kawaiilodon как решение

Решение

Kawaiilodon, используйте std::runtime_error из <stdexcept>

C++
1
2
3
4
5
6
7
8
class framework_error
    : public std::runtime_error
{
public:
    framework_error(char const* const _sErr) : std::runtime_error(_sErr) 
    {
    }
};
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
C++
1
explicit exception(char const* const _Message) noexcept
Нестандартное расширение VC++.

Добавлено через 1 минуту
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
Почему подобного рода запись
C++
1
char const* const _sErr
воспринимается компилятором нормально
А почему она должна восприниматься ненормально?
Это константный указатель на константную строку, всего лишь.

C++
1
char const (1) * const (2) _sErr
1 - этот const относится к char, т.е. содержимое элементов массива по указателю - константа.
2 - этот const относится к char const *, т.е. переменная этого (вот именно этого, выделенного) типа - константа.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.01.2020, 07:20
Помогаю со студенческими работами здесь

идентификатор _ReturnAddr идентификатор не определён; _ReturnAddress идентификатор не найден
#include &quot;Hooks.h&quot; #include &quot;Hacks.h&quot; #include &quot;Chams.h&quot; #include &quot;Menu.h&quot; #include &quot;Interfaces.h&quot; #include &quot;RenderManager.h&quot; ...

Не работает глобальный идентификатор extern
У меня два файла : main.cpp func.cpp во втором файле обьявлена и инициализирована extern int a = 3; Почему в первом файле она...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru