このようなものの違いは何ですか
friend Circle copy(const Circle &);
そして、このようなもの
friend Circle copy(Circle&) const;
関数が呼び出されたオブジェクトを変更しようとしないことをコンパイラに伝えるために関数が使用された後の const を知っていますが、他のオブジェクトはどうですか?
最初の形式はCircle
、関数のパラメーターである参照にバインドされたオブジェクト(の状態) が、その参照copy()
によって変更されないことcopy()
を意味します。参照は への参照であるため、それ自体が として修飾されていないその参照を介してconst
のメンバー関数を呼び出すことはできません。Circle
const
一方、2 番目の形式は不正です。-修飾できるのはメンバー関数const
のみです (ただし、宣言しているのはグローバルfriend
関数です)。
const
メンバー関数を修飾する場合、修飾は暗黙のthis
引数を参照します。言い換えれば、その関数は、それが呼び出されたオブジェクト (暗黙のthis
ポインターが指すオブジェクト) の状態を変更することはできません - オブジェクトは例外ですmutable
が、それは別の話です。
コードでそれを言うには:
struct X
{
void foo() const // <== The implicit "this" pointer is const-qualified!
{
_x = 42; // ERROR! The "this" pointer is implicitly const
_y = 42; // OK (_y is mutable)
}
void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
{
obj._x = 42; // OK! obj is a reference to non-const
_x = 42; // ERROR! The "this" pointer is implicitly const
}
void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
{
obj._x = 42; // ERROR! obj is a reference to const
obj._y = 42; // OK! obj is a reference to const, but _y is mutable
_x = 42; // OK! The "this" pointer is implicitly non-const
}
int _x;
mutable int _y;
};
C++ クラス メソッドには、this
すべての明示的なメソッドの前にある暗黙的なパラメーターがあります。したがって、関数は次のようにクラス内で宣言されます。
class C {
void f(int x);
実際には次のように見えると想像できます。
void f(C* this, int x);
ここで、次のように宣言すると、次のようになります。
void f(int x) const;
まるであなたがこれを書いたかのようです:
void f(const C* this, int x);
つまり、末尾const
はthis
パラメータを const にします。これは、クラス タイプの const オブジェクトでメソッドを呼び出すことができ、メソッドが呼び出されたオブジェクトを (少なくとも、通常のチャネルを介してではなく) 変更できないことを意味します。
Circle copy(Circle&) const;
関数const
自体を作成します。これは、クラス/構造体のメンバー関数にのみ使用できます。
メンバー関数を作るというconst
ことは、
const
ます(const
オブジェクトは関数のみを呼び出すことができconst
ます)。非 const オブジェクトもconst
関数を呼び出すことができます。次に、次のものを検討してください。
Circle copy(const Circle &);
これは、渡されたパラメーターを関数内で変更できないことを意味します。クラスのメンバー関数である場合とそうでない場合があります。
注:const
同じ関数の非 const バージョンを持つような方法で関数をオーバーロードすることは可能です。
1 つはパラメーターを参照し、もう 1 つは関数を参照します。
Circle copy(const Circle &);
これは、渡されたパラメーターを関数内で変更できないことを意味します。
Circle copy(Circle&) const;
修飾されたconst
関数はメンバー関数に使用され、オブジェクト自体のデータ メンバーを変更できないことを意味します。あなたが投稿した例は無意味でした。
最初の関数を のように書き直すCircle copy(Circle const&);
と、同じことを意味し、右から左に読むと便利であることが明らかになります。オブジェクトへの参照を受け取り、参照によってオブジェクトを返すcopy
関数です。const
Circle
Circle
friend Circle copy(const Circle &);
// 関数の定数パラメータを参照します。パラメータによって保存された値を変更することはできません。
あなたの例で友達を削除する必要があります Circle copy(Circle&) const; //定数メンバー関数として名前が付けられたこのポニター値を変更することはできません
friend Circle copy(const Circle &);
パラメータの値は、関数呼び出し中に変更されません。
friend Circle copy(const Circle &)const ;
この関数は、クラス メンバーの値を変更しないアクセサーです。一般に、アクセサーとミューテーターという関数のタイプがあります。アクセサー: オブジェクトの状態を調べますが、変更しません。