Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/89: Рейтинг темы: голосов - 89, средняя оценка - 4.66
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185

Работа с const

09.09.2011, 22:17. Показов 18141. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните пожалуйста разницу между вызовами двух функций:

C++
1
int func(const char *name)
и

C++
1
int func(char *name)
Я плохо понимаю - что дает этот спецификатор const? Что может произойти если его не указать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2011, 22:17
Ответы с готовыми решениями:

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

Работа с ключевым словом const
Всем мира! Снова приходится обращаться к вам, дорогие форумчане за разъяснением вот какой штуки. Сейчас изучаю Эффективное Использование...

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

21
Уничтожитель печенек
 Аватар для Zverit
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
09.09.2011, 22:21
const дает меньше привилегий. И избавляет от случайного изменения данных
1
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
09.09.2011, 22:25  [ТС]
А есть ли смысл тогда писать:

C++
1
int func(const char name)
то есть не указатель, а просто символ? Ведь все равно создается копия переменной.
0
Уничтожитель печенек
 Аватар для Zverit
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
09.09.2011, 22:39
Есть смысл. Если не хотите что бы значение менялось в теле функции, например.
1
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
09.09.2011, 22:41
ITZver, но читающего прототип такой функции отвлечёт спецификатор const к параметру - не указателю. Наверное, никто почти не использует такую форму?
1
22 / 22 / 2
Регистрация: 08.09.2011
Сообщений: 22
09.09.2011, 23:51
Цитата Сообщение от adamo86 Посмотреть сообщение
А есть ли смысл тогда писать:

C++
1
int func(const char name)
то есть не указатель, а просто символ? Ведь все равно создается копия переменной.

Вот Вам маленький примерчик:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "iostream"
#include "locale"
 
using namespace std ;
 
int getCode(const char name) ;      //Функция возвращает Аски код символа. Принимает константный символ
int getCode1(char  name);           //Функция возвращает Аски код символа. Принимает просто символ
 
int main()
{
    setlocale(LC_ALL,".OCP") ;
 
    const char pStr1 = 'a' ;       //Сивол , который будем передавать в функцию
 
    int nCodeBadge   = getCode(pStr1) ;
    int nCodeBadge1  = getCode1(pStr1) ;
 
    wcout << "Код символа A: " << nCodeBadge <<endl ;  //Получаем значение 97
    wcout << "Код символа A: " << nCodeBadge1<<endl ;  //Получаем значение 98
 
    
    return 0;
}
 
/* Функция принимает константный символ. Это значит, что внутри тела функции парамент name не может ни каким  образом изменить свое значение. Это гарантирует то, что содержимое name не будет изменено. 
*/
int getCode(const char name )
{
    name = 'b' ;    //Ошибка. Не имеем права 
    return (int) name ;
}
 
/* Функция принимает символ. Никакого const нету, поэтому мы может случайно или специально изменить содержимое
  параметра name. 
*/
int getCode1(char name)  //Передаем символ 'a' 
{   
    name = 'b' ;         //Меням содержимое    
    return (int) name;   //Мы передали символ 'a', но получили код символа 'b'
}
Надеюсь Вам помогло.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.09.2011, 10:55
Цитата Сообщение от adamo86 Посмотреть сообщение
А есть ли смысл тогда писать:

C++
1
int func(const char name)
то есть не указатель, а просто символ? Ведь все равно создается копия переменной.
С точки зрения того, кто вызывает функцию - смысла нет, потому как в прототипе модификтор const будет в данном случае игнорироваться, т.к. в прототипе функции учитывается только тип, но не имя переменной. Это легко проверить:

Code
1
2
3
4
5
6
7
8
9
10
$ cat t.cc
void func (const int x)
{
}
 
$ g++ t.cc -c
$ readelf --symbols t.o | grep FUNC
     8: 00000000     5 FUNC    GLOBAL DEFAULT    1 _Z4funci
$ c++filt _Z4funci
func(int)
С точки зрения того, кто пишет тело функции, модификатор имеет смысл, чтобы предотвратить собственные ошибки в случае, когда в параметр ничего нельзя записывать. Ведь параметр - это просто локальная переменная функции. Отличие параметра от локальной переменной только в том, что параметр инициализируется снаружи функции и распределяется на регистре или в стеке в соответствии с программными соглашениями, а не так, как того захочет компилятор

C
1
2
3
4
void func (const int x)
{
  x = 0;
}
На таком коде компилятор выругается. Функцию можно писать с const'ами. Но в прототипе const лучше не указывать, потому как с точки зрения вызова функции const не играет никакой роли (потому как в точке вызова создаётся копия фактического параметра), и, как уже говорилось выше, лишняя информация отвлекает. Т.е.

C
1
2
3
4
5
extern void func (int);
...
void func (const int x)
{
}
Можешь ещё почитать здесь Неочевидные ответы на простые вопросы раздел 4
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.09.2011, 12:30
Думаю, вообще хорошая практика объявлять константным всё, что по логике программы не должно изменяться. Во-первых больше шансов заметить ошибку, во-вторых тонкостей не знаю, но с памятью "только для чтения" работа как-то веселее происходит... Вот, что Отцы-Основатели по этому поводу пишут:
Квалификатор const применяется, разместить объекты в памяти, открытой только на чтение, или чтобы способствовать возможной оптимизации...
Компилятор может игнорировать указанные квалификаторы (const, volatile), однако обязан сигнализировать о явных попытках изменить значение const-объектов.
А 8.2. Спецификаторы типа.
1
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 21:17  [ТС]
Тогда поехали дальше... Что дает квалификатор const в данном случае:

C++
1
int func(int i)const {return i+1};
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
10.09.2011, 21:40
это неправда какая-то, ваще не компилируется. Где Вы это взяли?

Добавлено через 12 секунд
Code
1
1 F:\test\main.cpp non-member function `int func(int)' cannot have `const' method qualifier
Добавлено через 1 минуту
Наверное это отрывок из класса?
C++
1
2
3
4
5
class s 
{
      int func(int i)const {return i+1;}
};
int main(){}
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
10.09.2011, 21:40
dani какая неправда? такой код используется в классе, для константных методов
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
10.09.2011, 21:41
Цитата Сообщение от panicwassano Посмотреть сообщение
dani какая неправда? такой код используется в классе, для константных методов
Но тут не было кода класса! А вырывать нельзя. И если гадать, эт неправильно получится.
1
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 21:44  [ТС]
Да... Я извиняюсь, это по моему я из класса вырезал, где-то. Что значит константный метод?
0
Уничтожитель печенек
 Аватар для Zverit
281 / 209 / 49
Регистрация: 07.02.2010
Сообщений: 724
10.09.2011, 22:00
Цитата Сообщение от adamo86 Посмотреть сообщение
Что значит константный метод?
Метод объекта, который не изменяет данных класса
1
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
10.09.2011, 22:02
adamo86, это значит, что данный метод обязуется не изменять элементы своего класса (он может изменять только элементы со спецификатором const). Имеет смысл использовать для всех методов которые не изменяют состояние объекта. Так же, для константных объектов можно вызывать только константные методы.
0
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 22:02  [ТС]
Цитата Сообщение от ITZver Посмотреть сообщение
Метод объекта, который не изменяет данных класса
То есть, к примеру, значения переменных данного объекта, останутся не измененными?
0
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
10.09.2011, 22:03
adamo86, да

Добавлено через 36 секунд
В таких методах могут изменяться только неконстантные элементы объявленные со спецификатором mutable.
0
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 22:06  [ТС]
Цитата Сообщение от stdcout Посмотреть сообщение
(он может изменять только элементы со спецификатором const)
Это правильно сказано? Что-то я запутался уже.
0
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
10.09.2011, 22:13
adamo86, блин! прости. опечатался. хотел написать, что может изменять только неконстантный объекты, объявленные со спецификатором mutable.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.09.2011, 00:32
Цитата Сообщение от easybudda Посмотреть сообщение
Думаю, вообще хорошая практика объявлять константным всё, что по логике программы не должно изменяться. Во-первых больше шансов заметить ошибку, во-вторых тонкостей не знаю, но с памятью "только для чтения" работа как-то веселее происходит...
Статические переменные (переменные с временем жизни "вся программа") с квалификатором const многие компиляторы складывают в отдельные секции, которые в исполняемом файле попадают сегменты с исполняемым кодом и на уровне операционной системы они попадают в read-only память. Си'шные строковые литералы (текст в кавычках) по сути дела тоже являются const-объектами.

Следующие два кода без проблем пройдут компиляцию. В первом коде имеет место быть явное преобразование указателей и компилятор снимает с себя всю ответственность. Во втором коде работаем со строковым литералом, который по сути есть const-объект, но по языку можно его присваивать в указатель на char без модификатора const, Под линуксом эти коды сломаются на исполнении, под виндой - нет (по крайней мере на борланде у меня не упало)

C
1
2
3
4
5
6
7
8
9
const int a = 5;
 
int main (void)
{
  int *p;
  p = (int*) &a;
  *p = 0;
  return 0;
}
C
1
2
3
4
5
6
int main (void)
{
  char *p = "abcde";
  *p = 0;
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2011, 00:32
Помогаю со студенческими работами здесь

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

Отрисовка линий движения материальной точки при u_1=const и u_2=const
Добрый день. У меня не получается построить графики движения материальной точки для u_1=const и u_2=const. Полином 3-ей степени, решаю...

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

Ошибка E2034: Cannot convert 'char const[8]' to 'const wchar_t *'
Прошу прощения за свой вопрос, но я никак не пойму где ошибка? использую c++ builder 10 (если это как то связано) выдает следующие...

Ошибка: E2034 Cannot convert 'char const[51]' to 'const wchar_t *
Пытаюсь добавить в memo1 название файлов располагающихся в каталоге, в Console Application все отлично, а тут проблема. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru