9

違いは何ですか

void func(const Class *myClass)

void func(Class *const myClass)

以下も参照してください。

そしておそらく他の...

4

6 に答える 6

21

違いは、

void func(const Class *myClass)

const であるため変更できないクラスを指しています。ただし、 myClass ポインターを変更できます (別のクラスを指すようにします。ポインターがコピーされるため、呼び出し元に副作用はありません。ローカルのポインター コピーのみが変更されます)。

void func(Class *const myClass)

これで myClass は変更可能なクラスを指しますが、パラメーターは変更できません。

于 2009-01-28T09:56:23.643 に答える
12

最初のものでは、定数 Class オブジェクトへのポインターを受け入れる関数を宣言しています。関数内のオブジェクトを変更することはできません。2 つ目では、非定数 Class オブジェクトへの定数ポインターを受け入れる関数を宣言しています。ポインターを介してオブジェクトを変更できますが、ポインター値自体を変更することはできません。

私は常にこの簡単なルールを心に留めています。const常にすぐ左のものに適用され、このものが存在しない場合は、すぐ右のものに適用されます。

また、1週間前に私が尋ねたこの質問も見てください。これは、constの正確性を理解するための非常に役立つリンクをいくつか示しています。

于 2009-01-28T09:57:12.443 に答える
5

経験則として、宣言は右から左に読むことです。

void func(const Class *myClass)const クラスへのポインタ (または厳密に言えば、「const であるクラスへのポインタ」)

void func(Class *const myClass)クラスへの const ポインタです

于 2009-01-28T10:06:46.680 に答える
2
void func(const Class *myClass) { //...

他の回答で述べたように、この定義は、パラメーターが、関数によって変更 (および除外)できないmyClassインスタンスを指すことを意味します。ただし、関数本体の変数は、 の別のインスタンスを指すように変更できます。これは関数の実装の詳細です。Classmutableconst_castmyClassClass

void func(Class *const myClass) { // ...

一方、この定義は、myClassパラメーターがClassconst ではないインスタンスへのポインターであるため、クラスインスタンスを完全に操作するために関数で使用できるが、myClassポインター変数自体を変更して他のものを指すようにすることはできないことを意味します関数本体。

他の回答で提起されていない重要なポイントの 1 つは、関数シグネチャの場合、関数の型を考慮するときにトップレベルの const または volatile 修飾が無視されることです。これは、パラメーターが常に値渡しされるためです。そのため、const であるかどうかは、関数の本体でパラメーター自体を変更できるかどうかにのみ影響し、呼び出し元に影響を与えることはできません。

したがって、これら 2 つの関数宣言は同等です。

void func(Class *const myClass);

void func(Class *myClass);
于 2009-01-28T10:50:47.717 に答える
2

秘訣は、これらのことを逆に読むことです。

void func(const Class *myClass)

「myClass は、const であるクラスへのポインターです」と表示されます。これは、クラスを変更できないことを意味します。

void func(Class *const myClass)

「myClass はクラスへの const ポインターです」と表示されます。これは、ポインターを変更できないことを意味します。

于 2009-01-28T10:11:33.287 に答える
1

C++ ではこれ

const MyClass *ptr 

この

MyClass const *ptr

どちらもtype の定数オブジェクトを指す変数ptrポインタであることを意味します。つまり、上記のオブジェクトを から変更することはできません。ただし、の他のオブジェクトを指すようにすることはできます。MyClassptrptrMyClass

対照的に、これは

MyClass *const ptr

変数オブジェクトをptr指す定数ポインタです。 MyClassここで、実際に ptr が指しているオブジェクトを変更できますが、ptr他のオブジェクトを指すようにすることはできません。

上記の 3 種類の構文のうち、2 番目の構文は少し奇妙ですが、有効な構文です。ここにいる他の人々が提案している左から右への読み取り規則に従っていません。しかし、それはあなたにとって C++ での生活です。

于 2009-01-28T10:02:51.027 に答える