stackoverflow に関する同様の質問に対する回答がいくつかありますが、それらはすべて不完全であるか、比較がありません (例が異なります)。宣言の可能性のあるケースを少なくとも 3 つ見ました。
const void f();
void f() const;
const void f() const;
それらの違いは何ですか?
私が見つけた唯一の違いは、次のコードが (2) または (3) でのみ機能することです。
const foobar fb;
fb.foo();
stackoverflow に関する同様の質問に対する回答がいくつかありますが、それらはすべて不完全であるか、比較がありません (例が異なります)。宣言の可能性のあるケースを少なくとも 3 つ見ました。
const void f();
void f() const;
const void f() const;
それらの違いは何ですか?
私が見つけた唯一の違いは、次のコードが (2) または (3) でのみ機能することです。
const foobar fb;
fb.foo();
通常、const
その直前にあるものを変更します (常に、変更したものの直後に記述する必要があります)。あなたが示す場合:
const void f();
const は無視されます。このようなことを書かないでください。それは読者を混乱させます。
void f() const;
これは、「const」関数を宣言します (const
関数宣言の直前にあるためです。const 関数の概念は少し特殊です。非静的メンバー関数にのみ適用され、の型が に
this
なることを意味しますT const*
。実際にはT*
、関数が呼び出されたオブジェクトの監視可能な状態を変更しないという約束と見なされます。
const void f() const;
前作と全く同じ。最初const
は無視されます。
もちろん、他にも多くの場所const
が表示されます。
void const* f();
たとえば、const void へのポインターを返す関数を宣言します。(これは次のように書かれていることがよくあります。
const void* f();
の前に何もない場合はconst
、その後に適用されます。ただし、一般的な規則として、このスタイルが非常に広まっている場合でも、避けることが望ましいです。)
最初の例として書いたものとの違いに注意してください。ここで、戻り値の型はポインターであり、const
はポインター ( となるvoid *const
) ではなく、指定されたものに適用されます。クラス以外の戻り値の型では最上位const
は無視されますが (void *const f();
と同じです
void* f();
)、これは他の const には当てはまりません。
1) const void f();
戻り値の型を定数として参照します。テンプレートの例で役立ちます。cv 修飾を無視しvoid
たり、エラーにしたりすると、コンパイラの実装とエンドユーザー コードの両方に関して不必要な複雑さが生じる可能性があります。例えば:
template<typename T>
const T ...
関数の戻り値は右辺値です。型の右辺値はcv-qualifiednon-const
ではないため、単に-と同じで、この場合は無視されます。あまり役に立ちませんが、用途があります。g++は、次のコードがコンパイルされないため、問題になる可能性があることを確認しますvoid const
void
const
const void
const void*
const void
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
2) void f() const;
クラスメンバーを参照します。これは、クラス/構造体の (可変でない) メンバーを変更しないことを宣言したり、const を「壊す」ことなく変更できるものを返さないことを宣言する関数です。これが、そのような関数のみを定数オブジェクトで呼び出すことができる理由です
const foobar fb;
fb.foo(); // OK
しかし
void f();
const foobar fb;
fb.foo(); // error
最後に
3) const void f() const;
上記の両方を一緒に
キーワードが使われている場合もありconst
ます(ご質問いただいたものも含めて)
1. 宣言された定数
const int 定数_変数 = 2;
定数変数 (constant_variable
上記の例では) の値は、値が割り当てられた後に変更することはできません。
2.定数メンバー関数
Class Foo { int a_member_func()const; int a_member_variable; 可変 int mutable_variable; };
定数メンバー関数は、そのオブジェクトのメンバー変数を変更することは禁止されています。この場合a_member_func()
、変更は許可されていませんが、特別なケースとして、定数メンバー関数は( can change )a_member_varialbe
とマークされたメンバー変数の値を変更できます。mutable
a_member_func()
mutable_variable
3.Const 参照パラメータと Const ポインタ パラメータ
int a_func(const int& a, const int* b);
この場合、とa_func()
の値を変更することはできません。定数参照パラメーターと定数ポインター パラメーターは、それらが渡される関数によって変更することはできません。a
b
4.定数戻り型関数
const int a_func();
定数関数 (const
関数の戻り値の型の前に使用されるキーワード) は、常に定数値を返します。これはa_func()
、定数値を返すことを意味します。
これは const キーワードの使用法の完全なリストではありません。