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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 5.00
Bers
Заблокирован
#1

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

19.07.2011, 22:29. Просмотров 3511. Ответов 31
Метки нет (Все метки)

Постоянно путаюсь в этих константах. Как писать грамотнее?

Вот так:
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2011, 22:29     Модификатор const в аргументах функций
Посмотрите здесь:
C++ Const-параметры в аргументах функции
Модификатор доступа const C++
Модификатор const Очередные грабли с++? C++
Модификатор const в качестве возвращаемого значения C++
C++ Чисто виртуальные классы. Модификатор const
В чем различия константных объектов и константных ссылок на объекты в аргументах функций-членов? C++
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.07.2011, 22:32     Модификатор const в аргументах функций #2
Bers, Вообще const есть const... А вы присваиваете этот указатель другому => две переменные указывают на 1 адрес... В функции-то он конечно не меняется... Так что спорно. Я бы писал const.

Ну и вообще имхо резоннее делать через swap или же как в auto_ptr к примеру.

C++
1
2
3
4
5
    auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
        {   // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
        }
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 22:32     Модификатор const в аргументах функций #3
а mp_Pointer - член класса?
Bers
Заблокирован
19.07.2011, 22:35  [ТС]     Модификатор const в аргументах функций #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Вообще const есть const... А вы присваиваете этот указатель другому => две переменные указывают на 1 адрес... В функции-то он конечно не меняется... Так что спорно. Я бы писал const.
Вот и я так же подумал. Просто интересно, как люди делают в подобных случаях. Таки и прибегают к кастованию? Или как то покрасивее можно сделать?

Цитата Сообщение от Maxwe11 Посмотреть сообщение
а mp_Pointer - член класса?
ага
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 22:42     Модификатор const в аргументах функций #5
Цитата Сообщение от ForEveR Посмотреть сообщение
В функции-то он конечно не меняется
не меняется, но адресочек то копируется, а const с толку может сбить стороннего читателя)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.07.2011, 22:45     Модификатор const в аргументах функций #6
Не зная реализации трудно подсказать но все же...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class TypeT>
TLinePointer& TLinePointer<TypeT>::operator =(const TypeT* pointer)
{
    if (pointer == 0)
    {
        Release();
        return *this;
    }
    TLinePointer<TypeT> temp(pointer);
    swap(temp);
    mp_CounterLink = new int(1);
    pObject = 0;
    return *this;
}
Хотя я абсолютно не понимаю смысла этого кода... Видимо потому что не вижу функции Release().
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
19.07.2011, 22:46     Модификатор const в аргументах функций #7
Цитата Сообщение от ForEveR Посмотреть сообщение
А вы присваиваете этот указатель другому => две переменные указывают на 1 адрес... В функции-то он конечно не меняется... Так что спорно. Я бы писал const.
ForEveR, либо я тебя не понял, либо ты ошибаешься.

Елси я правильно понял, предлагается такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
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; 
    }
}
Тогда либо не скомпилируется, либо члены mp_Pointer и mp_CounterLink придется объявлять как mutable.
Bers
Заблокирован
19.07.2011, 22:46  [ТС]     Модификатор const в аргументах функций #8
а... сорри народ. Там 14 строчки на самом деле нету (забыл убрать, когда сюда копипастил)

Цитата Сообщение от ForEveR Посмотреть сообщение
Ну и вообще имхо резоннее делать через swap или же как в auto_ptr к примеру.
В данном случае это не подходит. Источник не обнуляется.
Да и указатели, что в аргументе, что внутри класса - самые обычные
Kastaneda
19.07.2011, 22:49
  #9

Не по теме:

А, все понял. Это я в суть дела невъехал))
сори...

Bers
Заблокирован
19.07.2011, 22:54  [ТС]     Модификатор const в аргументах функций #10
Суть в том, что если функция использует свои аргументы только для чтения, то идеологически их нужно объявлять константами. (правило хорошего тона. Хотя лично мне оч не нравится. Но вот, приходится приучать себя)

Но моя функция действительно только читает значение аргумента.
Однако! Попандос. Присвоить неконстрантному указателю значение константного нельзя.

Что делать? Я только два варианта придумал: либо послать константы нафег (раньше я всегда так и делал), либо использовать кастование.

Оба варианта - рабочие, вопрос в том, какой более грамотный?
Или может быть вообще, православные люди делают как то иначе?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.07.2011, 23:23     Модификатор const в аргументах функций #11
Bers, дико непривычная сигнатура. опер присваивания ничего не возвращающий...
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
19.07.2011, 23:36     Модификатор const в аргументах функций #12
Цитата Сообщение от Bers Посмотреть сообщение
Суть в том, что если функция использует свои аргументы только для чтения, то идеологически их нужно объявлять константами. (правило хорошего тона. Хотя лично мне оч не нравится. Но вот, приходится приучать себя)
Если используется const, то вызов функции должен проходить абсолютно безопасно(в смысле изменения) для её параметров, а здесь, хоть функция сама их и не изменяет, но присваивает адрес тем самым создает условия для дальнейшего их изменения. Так что я бы const не использовал.
Bers
Заблокирован
20.07.2011, 05:47  [ТС]     Модификатор const в аргументах функций #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, дико непривычная сигнатура. опер присваивания ничего не возвращающий...
это запрет на конструкции типа А=В=С

Добавлено через 6 часов 1 минуту
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Если используется const, то вызов функции должен проходить абсолютно безопасно(в смысле изменения) для её параметров, а здесь, хоть функция сама их и не изменяет, но присваивает адрес тем самым создает условия для дальнейшего их изменения. Так что я бы const не использовал.
Я подумал, и решил, что вы правы. Ели функция не может дать 100% гарантии, что значение константы не изменится, то конст_каст здесь больше смахивает на лёгкий хак с целью нарушить гарантии функции.

И применять его стоит только тогда, когда без него вообще никак не обойтись...
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
20.07.2011, 06:35     Модификатор const в аргументах функций #14
Цитата Сообщение от Bers Посмотреть сообщение
это запрет на конструкции типа А=В=С
Этот запрет делается опять возвратом const...
C++
1
const Sometype& operator=(const Sometype& r);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 07:08     Модификатор const в аргументах функций
Еще ссылки по теме:
int const и const int в чем разница этих записей C++
C++ Чем отличаются выражения (const int[]){value} от (const int[]){100}
Ошибка в аргументах функции C++
C++ Подробнее о функциях и аргументах
C++ Разница между объявлениями const Person p1 и Person const p1

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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2011, 07:08     Модификатор const в аргументах функций #15
C++
1
TypeT* TempPointer = const_cast<TypeT*>(pObject);
C++
1
const TypeT *TempPointer = pObject;
C++
1
mp_Pointer = TempPointer;
если mp_Pointer указывает на меняемые данные, то тогда непонятно, почему адрес неизменных данных копируется в переменную-указатель, используемую для изменения данных
Yandex
Объявления
20.07.2011, 07:08     Модификатор const в аргументах функций
Ответ Создать тему
Опции темы

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