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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 130, средняя оценка - 4.73
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
#1

Работа с const - C++

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

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

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

C++
1
int func(char *name)
Я плохо понимаю - что дает этот спецификатор const? Что может произойти если его не указать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 22:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с const (C++):

new const char[x]. Копия - C++
Возможно ли сделать так как мне этого хочется?) Завис я как то, голову ломаю как бы сотворить чтобы можно было динамически выделять память...

кое-что про const - C++
решил обновить свои знания про const и везде вижу что const это константа инициализировать нужно при объявлении.....ну это мы и так знаем...

Как компилятор обрабатывает член класса static constexpr const char* - C++
Привет! Наткнулся на непонятный момент class Foo { public: static constexpr const char* PTR = "value"; }; без...

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

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

MessageBox - Cannot convert 'wchar_t const[45]' to 'const char *' - C++ Builder
Добро всем! :senor: MessageBox(NULL,(LPCWSTR)L"Данные не сохранены ! \nЗакрыть не сохранив ?", (LPCWSTR)L"Мое супер приложение", ...

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

C++
1
int func(const char name)
то есть не указатель, а просто символ? Ведь все равно создается копия переменной.
0
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
09.09.2011, 22:39 #4
Есть смысл. Если не хотите что бы значение менялось в теле функции, например.
1
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
09.09.2011, 22:41 #5
ITZver, но читающего прототип такой функции отвлечёт спецификатор const к параметру - не указателю. Наверное, никто почти не использует такую форму?
1
Go0gle
18 / 18 / 1
Регистрация: 08.09.2011
Сообщений: 22
09.09.2011, 23:51 #6
Цитата Сообщение от 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
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,952
Записей в блоге: 27
10.09.2011, 10:55 #7
Цитата Сообщение от adamo86 Посмотреть сообщение
А есть ли смысл тогда писать:

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

Код
$ 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
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
10.09.2011, 12:30 #8
Думаю, вообще хорошая практика объявлять константным всё, что по логике программы не должно изменяться. Во-первых больше шансов заметить ошибку, во-вторых тонкостей не знаю, но с памятью "только для чтения" работа как-то веселее происходит... Вот, что Отцы-Основатели по этому поводу пишут:
Квалификатор const применяется, разместить объекты в памяти, открытой только на чтение, или чтобы способствовать возможной оптимизации...
Компилятор может игнорировать указанные квалификаторы (const, volatile), однако обязан сигнализировать о явных попытках изменить значение const-объектов.
А 8.2. Спецификаторы типа.
1
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 21:17  [ТС] #9
Тогда поехали дальше... Что дает квалификатор const в данном случае:

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

Добавлено через 12 секунд
Код
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
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
10.09.2011, 21:40 #11
dani какая неправда? такой код используется в классе, для константных методов
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
10.09.2011, 21:41 #12
Цитата Сообщение от panicwassano Посмотреть сообщение
dani какая неправда? такой код используется в классе, для константных методов
Но тут не было кода класса! А вырывать нельзя. И если гадать, эт неправильно получится.
1
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 21:44  [ТС] #13
Да... Я извиняюсь, это по моему я из класса вырезал, где-то. Что значит константный метод?
0
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
10.09.2011, 22:00 #14
Цитата Сообщение от adamo86 Посмотреть сообщение
Что значит константный метод?
Метод объекта, который не изменяет данных класса
1
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
10.09.2011, 22:02 #15
adamo86, это значит, что данный метод обязуется не изменять элементы своего класса (он может изменять только элементы со спецификатором const). Имеет смысл использовать для всех методов которые не изменяют состояние объекта. Так же, для константных объектов можно вызывать только константные методы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 22:02
Привет! Вот еще темы с ответами:

Const - C++ Builder
Начал изучать С++ токо кто знает в чём здесь проблема?? //---------------------------------------------------------------------------...

Cannot convert 'wchar_t *' to 'const char *' - C++ Builder
Перешол с 2010 билдера на XE7 и тут глюки. ...

Cannot convert 'wchar_t *' to 'const char *' - C++ Builder
Этот код работает в старом приложении а в новом не хочет... void KillProcess(int id) { HANDLE ps = OpenProcess(1, false, id); ...

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.09.2011, 22:02
Ответ Создать тему
Опции темы

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