新しいメソッドを書く必要があります。次のコードが与えられます。
const Class * func() const;
しかし、クラスと関数の両方が定数として宣言されているとはどういう意味でしょうか?
const Class * func() const;
はconst Class*
戻り型です。この関数は へのポインターを返すと書かれていますconst Class
。したがって、この関数を呼び出す人は誰でもポインターを受け取りますが、ポインターが指すオブジェクトを変更することはできません。
宣言のconst
最後の は、このメンバー関数が呼び出されているオブジェクトの状態を変更しないことを示しています。つまり、this
指しているオブジェクトは変更されません。実際、 のデータ メンバー ( ではないmutable
)を変更しようとするfunc
と、コンパイラが通知します。
const Class * func() const;
^^^^^ ^^^^^
1 2
1 つ目const
は、戻り値の型が であることを意味しconst Class*
ます。
2 つ目は、メソッドfunc
がそのクラス メンバーを変更しないことを意味します。
段落ごと§9.4/1
:
struct X {
void g() const;
};
メンバー関数が宣言されている場合
const
、の型this
はconst X*
したがって、 のメンバーを変更することはできませんX
。
const Class * ...
これはfunc
、 を返すことconst pointer
を意味しますClass
Class c;
Class* p = c.func() // Not allowed.
const Class* p = c.func() // OK.
p->mem = 2; // Not allowed. p is a const pointer.
func() const;
^^^^
つまり、クラスの状態に影響を与えません (メンバー変数をfunc
変更しません)。this
void Class::func(int& i) const {
this->mem = i; // is not allowed here since func() is const (unless 'mem' is mutable)
i = this->mem; // This is OK.
}