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

Работа с const

09.09.2011, 22:17. Показов 18031. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru