これは一種の基本ですが、私はこれを理解できないようです。ここを参照
void *p
とはconst void *p
十分に異なるか? 関数が のconst void *
代わりに使用するのはなぜvoid *
ですか?
まったく使用する理由void*
(かどうかにconst
かかわらず) は、それが提供する種類の汎用性です。これは基本クラスのようなものです。すべてのポインターは void*
暗黙的にキャストできますが、void*
型付きポインターへのキャストは明示的かつ手動で行う必要があります。
通常、C++ にはこれを行うためのより良い方法 (つまり、オブジェクト指向とテンプレート) が用意されているため、void*
C とインターフェイスする場合を除いて、これを使用する意味はconst
まったくありません。他の場所で提供されます。const_cast
参照されるオブジェクトを変更できるようにするには(追加の)が必要なので、誤って変更する可能性が低くなります。
もちろん、これは C スタイルのキャストではなく、明示的な C++ キャストを使用することに依存しています。void*
から any へのキャストにはT*
が必要でありstatic_cast
、これにより を削除することはできませんconst
。したがって、const void*
をconst char*
使用してキャストできますがstatic_cast
、にキャストすることはできませんchar*
。これには追加のconst_cast
.
C ++では、ポインターの前にあるconstは、ポインターのアドレスのデータを変更してはならないことを示しています。つまり、誰かがこれを行うのを止めます:
int v1 = 3;
int v2 = 4;
const int *pv = &v1;
pv = &v2 // ok;
*pv = 5; // error
ポインタ値自体をconstにすることもできます。
int v1 = 3;
int v2 = 4;
int * const pv = &v1;
*pv = 5; // ok
pv = &v2; // error
2つを組み合わせることもできます。
int v1 = 3;
int v2 = 4;
const int * const pv = &v1;
*pv = 5; // error
pv = &v2; // error
簡単な違いがあります。他の人が述べたように、C++ では型システムやテンプレートなどが優れているため、C++ で使用する必要はほとんどありませんvoid*
。ただし、C やシステム コールに接続する場合、既知の型のない値を指定する方法が必要になることがあります。
void*
あなたが尋ねるように、との違いconst void*
は、ポイントされたメモリの内容が呼び出している関数内で変更されるかどうかを示すヒントです。const
つまり、読み取り専用アクセスがあることを意味します。