Относительно вопроса 2.
Хороший способ думать о квалификаторах cv функции-члена - это думать о них как о квалификаторах в указателе 'this'.
Например, если мы написали несколькоКод C ++ в C:
class A
{
public:
void f1 ();
void f2 () const;
private:
int i;
};
Это то же самое, что и следующий код C:
struct A
{
int i;
};
void f1 (A * const this); // Non const member
void f2 (A const * const this); // Const member
Еще одна важная вещь, которую нужно понять, это то, что когда вы ссылаетесь на элемент не статических данныхк нему неявно добавляется класс (*this).
:
void A::f1 ()
{
i = 0; // This and the next line have the same meaning
(*this).i = 0;
}
Когда функция-член имеет значение const
, указатель this
объявляется как указывающий на объект const
:
void A::f2 () const
{
(*this).i = 0; // Error '*this' is const, so cannot modify (*this).i
}
Один из выводов, который иногда удивляет людей, заключается в том, что функция-член const
все еще может изменять данные, на которые указывает указатель на член.Например:
class A
{
public:
void f () const
{
*i = 0;
}
private:
int * i;
};
Это выглядит неправильно, но на самом деле это нормально.(*this).i
является константой, поэтому вы не сможете изменить то, на что указывает i
, но i
все еще является указателем на неконстантный int
, поэтому мы можем изменить значение, на которое указывает i
.