違いは何ですか
void func(const Class *myClass)
と
void func(Class *const myClass)
以下も参照してください。
そしておそらく他の...
違いは何ですか
void func(const Class *myClass)
と
void func(Class *const myClass)
以下も参照してください。
そしておそらく他の...
違いは、
void func(const Class *myClass)
const であるため変更できないクラスを指しています。ただし、 myClass ポインターを変更できます (別のクラスを指すようにします。ポインターがコピーされるため、呼び出し元に副作用はありません。ローカルのポインター コピーのみが変更されます)。
void func(Class *const myClass)
これで myClass は変更可能なクラスを指しますが、パラメーターは変更できません。
最初のものでは、定数 Class オブジェクトへのポインターを受け入れる関数を宣言しています。関数内のオブジェクトを変更することはできません。2 つ目では、非定数 Class オブジェクトへの定数ポインターを受け入れる関数を宣言しています。ポインターを介してオブジェクトを変更できますが、ポインター値自体を変更することはできません。
私は常にこの簡単なルールを心に留めています。const
常にすぐ左のものに適用され、このものが存在しない場合は、すぐ右のものに適用されます。
また、1週間前に私が尋ねたこの質問も見てください。これは、constの正確性を理解するための非常に役立つリンクをいくつか示しています。
経験則として、宣言は右から左に読むことです。
void func(const Class *myClass)
const クラスへのポインタ (または厳密に言えば、「const であるクラスへのポインタ」)
void func(Class *const myClass)
クラスへの const ポインタです
void func(const Class *myClass) { //...
他の回答で述べたように、この定義は、パラメーターが、関数によって変更 (および除外)できないmyClass
インスタンスを指すことを意味します。ただし、関数本体の変数は、 の別のインスタンスを指すように変更できます。これは関数の実装の詳細です。Class
mutable
const_cast
myClass
Class
void func(Class *const myClass) { // ...
一方、この定義は、myClass
パラメーターがClass
const ではないインスタンスへのポインターであるため、クラスインスタンスを完全に操作するために関数で使用できるが、myClass
ポインター変数自体を変更して他のものを指すようにすることはできないことを意味します関数本体。
他の回答で提起されていない重要なポイントの 1 つは、関数シグネチャの場合、関数の型を考慮するときにトップレベルの const または volatile 修飾が無視されることです。これは、パラメーターが常に値渡しされるためです。そのため、const であるかどうかは、関数の本体でパラメーター自体を変更できるかどうかにのみ影響し、呼び出し元に影響を与えることはできません。
したがって、これら 2 つの関数宣言は同等です。
void func(Class *const myClass);
void func(Class *myClass);
秘訣は、これらのことを逆に読むことです。
void func(const Class *myClass)
「myClass は、const であるクラスへのポインターです」と表示されます。これは、クラスを変更できないことを意味します。
void func(Class *const myClass)
「myClass はクラスへの const ポインターです」と表示されます。これは、ポインターを変更できないことを意味します。
C++ ではこれ
const MyClass *ptr
この
MyClass const *ptr
どちらもtype の定数オブジェクトを指す変数ptr
ポインタであることを意味します。つまり、上記のオブジェクトを から変更することはできません。ただし、の他のオブジェクトを指すようにすることはできます。MyClass
ptr
ptr
MyClass
対照的に、これは
MyClass *const ptr
変数オブジェクトをptr
指す定数ポインタです。 MyClass
ここで、実際に ptr が指しているオブジェクトを変更できますが、ptr
他のオブジェクトを指すようにすることはできません。
上記の 3 種類の構文のうち、2 番目の構文は少し奇妙ですが、有効な構文です。ここにいる他の人々が提案している左から右への読み取り規則に従っていません。しかし、それはあなたにとって C++ での生活です。