以下の宣言はすべて同じですか?もしそうなら、定数関数を宣言する標準的な方法は何ですか?
const SparseMatrix transpose();
SparseMatrix transpose() const;
const SparseMatrix transpose() const;
以下の宣言はすべて同じですか?もしそうなら、定数関数を宣言する標準的な方法は何ですか?
const SparseMatrix transpose();
SparseMatrix transpose() const;
const SparseMatrix transpose() const;
関数名の左側にあるconstは、返されるオブジェクトを変更できないことを意味します。右側のconstは、メソッドがクラスの一部であり、そのデータメンバーを変更しないことを意味します。mutable
そのデータメンバーのいずれかがキーワードで宣言されていない限り、またはもちろんその場合、const
警備員にもかかわらずその変更は許可されます。
const
関数の戻り型が非ポインター型の場合、キーワードの配置は重要ではありません。
T const f(); // same as const T f();
ただし、ポインタをリターンタイプとしてconst
使用する場合は、キーワードの配置が重要であることに注意してください。例えば:
const T* f();
このメソッドは、constへのポインタを返しますT
。つまり、それが指すものは不変です。したがって、返されたポインタの逆参照を介して割り当てを行うことはできません。
T* x = f();
*x = y; // error: assignment of read-only location '*(const T*)x'
constが戻り型(つまりポインター)のすぐ右側に配置されている場合、それはポインターがconstであり、変更できないことを意味します。
T* const f();
int main()
{
T* x const;
x = f(); // error: assignment of read-only variable 'x'
}
さらに、ポインタの戻り型の両側にあり、「const
クラスメンバーの変更なし」を示している場合、次のように読み取られます。const
const T* const f() const;
f
constへのconstポインタを返すという名前のconstメンバー関数T
SparseMatrix
最初のものは、 constであり、変更できないaを返します。
2つ目は、を返す関数を宣言し、SparseMatrix
可変メンバーを除いて、関数がクラス変数を変更しないことを保証します(メンバー関数であると仮定します。そうでない場合、この減速では意味がありません)。
最後のものは両方を行います。
1)const値を返します2)const関数、その内部でメンバーは変更されません3)1)+2)