перегрузка операторов и использование const_cast - PullRequest
1 голос
/ 15 сентября 2011

Для следующего фрагмента кода,

class A{
  const int a;
  public:
  A(): a(0){}
  A(int m_a):a(m_a){};
  A& operator =(const A &other);
};
A & A::operator =(const A &other)
{
  const_cast<int&>(a) = other.a;
  return *this;
}

что означают строки

A & A::operator =(const A &other)

const_cast<int&>(a) = other.a;

означает? Или почему этот оператор определяется таким образом? Другими словами, я чувствую растерянность относительно его использования и того, как оно определено / написано

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

const_cast удаляет const из const члена a, что позволяет успешно выполнить присвоение из other.a (без const_cast тип a будет const int,и, следовательно, это не будет изменяемым).

Вероятно, идея заключается в том, что a инициализируется при построении класса и не может быть изменен "путем проектирования" в любом другом месте, но автор классарешил сделать исключение для присвоения.

У меня смешанные чувства по отношению к этому коду, очень часто использование const_cast является признаком плохого дизайна, с другой стороны, это может быть логично разрешитьприсваивать, но сохранять const для всех других операций.

0 голосов
/ 15 сентября 2011

a является константной переменной-членом. const_cast (a) обходит правила правильности const. В противном случае вы можете назначить только в списке инициализатора конструктора.

...