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

C++

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

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

09.09.2011, 22:17. Просмотров 15840. Ответов 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
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 22:02  [ТС] #16
Цитата Сообщение от ITZver Посмотреть сообщение
Метод объекта, который не изменяет данных класса
То есть, к примеру, значения переменных данного объекта, останутся не измененными?
0
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
10.09.2011, 22:03 #17
adamo86, да

Добавлено через 36 секунд
В таких методах могут изменяться только неконстантные элементы объявленные со спецификатором mutable.
0
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
10.09.2011, 22:06  [ТС] #18
Цитата Сообщение от stdcout Посмотреть сообщение
(он может изменять только элементы со спецификатором const)
Это правильно сказано? Что-то я запутался уже.
0
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
10.09.2011, 22:13 #19
adamo86, блин! прости. опечатался. хотел написать, что может изменять только неконстантный объекты, объявленные со спецификатором mutable.
1
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
11.09.2011, 00:32 #20
Цитата Сообщение от 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
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
11.09.2011, 12:18 #21
Цитата Сообщение от Evg Посмотреть сообщение
Следующие два кода без проблем пройдут компиляцию.
Ну я и не говорил, что модификатор const - панацея от всех несчастий. Вот такой код не будет компилироваться
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main (void)
{
  const char str[] = "abcde";
  *str = 'A';
  printf("%s\n", str);
  return 0;
}

adamo86, если попытаться скомпилировать вот это
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
class Name{
    std::string _name;
public:
    Name(const std::string & name) : _name(name) {}
    std::string get() { return _name; }
};
 
void func(const Name & n){
    std::cout << n.get() << std::endl;
}
 
int main(){
    std::vector<Name> vec;
    vec.push_back(Name("Vasya"));
    vec.push_back(Name("Kolya"));
    vec.push_back(Name("Petya"));
    
    for_each(vec.begin(), vec.end(), func);
    
    return 0;
}
получите
Код
$ g++ -o for_each for_each.cpp 
for_each.cpp: In function ‘void func(const Name&)’:
for_each.cpp:14: error: passing ‘const Name’ as ‘this’ argument of ‘std::string Name::get()’ discards qualifiers
ну или вроде того. Объявите метод get() константным
C++
1
std::string get() const { return _name; }
и всё получится.
Код
$ ./for_each 
Vasya
Kolya
Petya
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
11.09.2011, 18:37 #22
Цитата Сообщение от easybudda Посмотреть сообщение
Ну я и не говорил, что модификатор const - панацея от всех несчастий
Я и не говорил, что ты говорил, просто уточнил

Цитата Сообщение от easybudda Посмотреть сообщение
Вот такой код не будет компилироваться
Тут делается явная запись по указателю, объявленному как const

Цитата Сообщение от easybudda Посмотреть сообщение
adamo86, если попытаться скомпилировать вот это
Примерно то же самое, что и

C
1
2
3
const char *p1;
char *p2;
p2 = p1;
т.е. в методах с признаком const этот квалификатор распространяется на неявный указатель this
0
11.09.2011, 18:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 18:37
Привет! Вот еще темы с ответами:

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: делает содержимое массива или...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

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