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

Модификатор const в аргументах функций - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 5.00
Bers
Заблокирован
19.07.2011, 22:29     Модификатор const в аргументах функций #1
Постоянно путаюсь в этих константах. Как писать грамотнее?

Вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
     template<typename TypeT>  
void TLinePointer<TypeT>::operator = (TypeT* pObject)  //функция не меняет аргумент
{                               //по идее, просится const
    if(pObject==0) { Release(); return; }
    if(mp_Pointer != pObject)  
    {  
        Release();
        mp_Pointer = pObject; 
        mp_CounterLink=new int; 
        *mp_CounterLink=1;
        pObject=0; 
    }
}
Или вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     template<typename TypeT>  
void TLinePointer<TypeT>::operator = (const TypeT* pObject) 
{
    if(pObject==0) { Release(); return; }
    if(mp_Pointer != pObject)  
    {  
        Release();
        TypeT* TempPointer = const_cast<TypeT*>(pObject); 
                                                      //приходится кастовать, потому что
        mp_Pointer = TempPointer;      //нельзя неконстантному указателю 
                                                      //присвоить константный напрямую
        mp_CounterLink=new int; 
        *mp_CounterLink=1;
        pObject=0; 
    }
}
Интуиция мне подсказывает, что второй вариант более правильный (хотя и приходиться совершать больше движений)

А что подскажут уважаемые эксперты? Или может быть есть ещё какие то варианты?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
20.07.2011, 08:07  [ТС]     Модификатор const в аргументах функций #21
Цитата Сообщение от accept Посмотреть сообщение
таким образом он должен указывать на const
Но он может обнулиться!

Он гарантирует, что ничего не сделает с содержимом того, на что указывает.
Но с самим собой он может делать что угодно!

Добавлено через 7 минут
Цитата Сообщение от accept Посмотреть сообщение
это где-то сверху должно быть
имя типа TypeT должно быть там известно
Нет, ибо данная переменная "перемена" по задумке и логике.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 08:23     Модификатор const в аргументах функций #22
Цитата Сообщение от Bers Посмотреть сообщение
Но он может обнулиться!
Ну тут проблема была бы если бы указатель был const (а не то, на что он указывает).
Вот абсолютно нормальный код:
C++
1
2
3
4
5
6
        int a=10;
    const int* ptr;
    ptr=&a;
    std::cout<<ptr<<std::endl;
    ptr=NULL;
    std::cout<<ptr<<std::endl;
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2011, 08:45     Модификатор const в аргументах функций #23
Цитата Сообщение от Bers
Но он может обнулиться!

Он гарантирует, что ничего не сделает с содержимом того, на что указывает.
Но с самим собой он может делать что угодно!
Цитата Сообщение от Bers
2. Да
похоже, что нет

присваивать нельзя именно в таком случае, когда происходит неявная потеря свойства неизменности данных
то есть были константные данные, указатель на них присвоили указателю, который указывает на неконстантные данные

Добавлено через 9 минут
C
1
2
3
4
    char c = 'a';
    const char cc = 'b';
 
    c = cc;
это правильно

C
1
2
3
4
5
6
7
    char c = 'a';
    char *pc;
    const char *cpc;
 
    pc = &c;
    cpc = &c;
    pc = cpc;
это неправильно

Код
[guest@localhost tests]$ .ansi t.c -o t
t.c: В функции ‘main’:
t.c:12:8: предупреждение: присваивание отменяет квалификаторы указуемого типа
[guest@localhost tests]$
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.07.2011, 08:56     Модификатор const в аргументах функций #24
Цитата Сообщение от Bers Посмотреть сообщение
/приходится кастовать, потому что //нельзя неконстантному указателю //присвоить константный напрямую
Цитата Сообщение от Bers Посмотреть сообщение
Однако! Попандос. Присвоить неконстрантному указателю значение константного нельзя
Не стоит путать константный указатель и указатель на константу.

Цитата Сообщение от Bers Посмотреть сообщение
TypeT* TempPointer = const_cast<TypeT*>(pObject);
Можно заменить на
C++
1
const TypeT * temp = pObject;
Цитата Сообщение от Bers Посмотреть сообщение
Что делать?
Я для себя давно уже решил и использую принцип максимальным ограничений. Всё что может быть private делается private. Всё что может быть const делается константным. Компилятору всё равно, а мне жить проще. Множество потенциальных ошибок просто невозможно совершить.

А вообще, почитай, что значит вот это:
C++
1
2
3
const int * a;
int * const b;
const int * const c;
Итого: Ничего плохого в const быть не может. Плохое может быть в const_cast, но его (плохого) может в нём и не быть.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
20.07.2011, 18:47     Модификатор const в аргументах функций #25
Цитата Сообщение от Deviaphan Посмотреть сообщение
Плохое может быть в const_cast, но его (плохого) может в нём и не быть
Само приведение типа, может повлиять на данные, вот пример .
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
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
 
 
void _str1(char* s) {
   while( *s )
      *s++ = 'A';
}
 
 
void _str2(const char* s) {
   char* c = (char*) s;
   while( *c )
      *c++ = 'B';
}
 
 
void _str3(char* const s) {
   char* c = (char*) s;
    while( *c )
      *c++ = 'C';
}
 
 
void _str4(const char* const s) {
    char* c = (char*) s;
    while( *c )
      *c++ = 'D';
}
 
 
 
int main(void)
{
   char s[] =  "address ptr";
 
   puts(s);
 
   _str1(s);
   puts(s);
 
   _str2(s);
   puts(s);
 
   _str3(s);
   puts(s);
 
   _str4(s);
   puts(s);
 
 
   getchar();
   return 0;
}
Bers
Заблокирован
20.07.2011, 19:51  [ТС]     Модификатор const в аргументах функций #26
Ну все, вразумел вроде бы. Блин... даже и не подумал бы, что столько нюансов может быть с этой константностью.

Моя идея о том, что константа - это "переменная" ONLY READ рассыпается на куски....
А жаль.... Ещё совсем вчера было намного проще жить в этом мире.

Последний вопрос:
Допустим мой Потребитель "запоминает" где живёт его Менеджер.
Внутри класса Потребителя находится указатель на объект класса Менеджера.
Поскольку внутри Потребителя никогда не будут происходить операции типа:
delete pМенеджер; pМенеджер = NULL;

Более того - и не должны происходить!
То указатель на менеджера можно (а значит и нужно) сделать константным.
Это будит означать, что Потребитель не отвечает, за время жизни своего Менеджера. И Ничего не может сделать с той областью памяти, где этот Менеджер живёт (не может его убить).

Я все правильно понял?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,375
Записей в блоге: 26
20.07.2011, 20:00     Модификатор const в аргументах функций #27
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Bers, не видя всего исходника целиком сложно понять, чего конерктно ты не понимаешь или понимаешь, но не правильно. На всякий случай почитай тут Неочевидные ответы на простые вопросы раздел 4, лишним не будет

Добавлено через 27 секунд
Цитата Сообщение от xAtom Посмотреть сообщение
Само приведение типа, может повлиять на данные, вот пример
Только при этом программист - сам дурак
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.07.2011, 20:02     Модификатор const в аргументах функций #28
Константный указатель - это указатель на область памяти, которому нельзя присвоить указатель на другую область памяти.
Указатель на константу - это указатель на область памяти, которую нельзя изменить через этот указатель.
Константный указатель на константу - оба этих ограничения.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,375
Записей в блоге: 26
20.07.2011, 20:08     Модификатор const в аргументах функций #29
Цитата Сообщение от Deviaphan Посмотреть сообщение
Константный указатель - это указатель на область памяти, которому нельзя присвоить указатель на другую область памяти.
Указатель на константу - это указатель на область памяти, которую нельзя изменить через этот указатель.
Константный указатель на константу - оба этих ограничения.
Причём надо понимать, что "нельзя" в обоих случаях означает "нельзя в языке программирования". И в подавляющем большинстве случаев это означает "если очень хочется, то можно, но компилятор за последствия не отвечает". А в оставшихся случаях это действительно "нельзя", потому что тебе это не даст сделать операционная система или даже аппаратура
Bers
Заблокирован
20.07.2011, 20:24  [ТС]     Модификатор const в аргументах функций #30
У меня была путаница в голове, я думал что константный указатель указывает собственно на константу, а не то, что он сам по себе является константой.

Теорию проштудировал, ошибку осознал.

Если и остались ещё какие то неясности - думаю практика это исправит.

Всем огромное спасибо за участие.
Думаю, что тему можно закрыть.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.07.2011, 01:43     Модификатор const в аргументах функций #31
Цитата Сообщение от Bers
Моя идея о том, что константа - это "переменная" ONLY READ рассыпается на куски....
это почему ?

C
1
2
3
4
    char c = 'a';
    const char cc = 'b';
 
    c = cc;
переменная cc как была read-only, так и осталась
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2011, 08:18     Модификатор const в аргументах функций
Еще ссылки по теме:

C++ Const-параметры в аргументах функции
Модификатор доступа const C++
Модификатор const в качестве возвращаемого значения C++
В чем различия константных объектов и константных ссылок на объекты в аргументах функций-членов? C++
Ошибка в аргументах функции C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.07.2011, 08:18     Модификатор const в аргументах функций #32
Цитата Сообщение от xAtom Посмотреть сообщение
Само приведение типа, может повлиять на данные, вот пример
Привидение типа на данные не повлияло. Это следующее за ним присваивание повлияло.
Yandex
Объявления
21.07.2011, 08:18     Модификатор const в аргументах функций
Ответ Создать тему
Опции темы

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