このようなものの違いは何ですか
friend Circle copy(const Circle &);
そしてこのようなもの
friend Circle copy(Circle&) const;
関数が呼び出されたオブジェクトを変更しようとしないことをコンパイラに伝えるために関数が使用された後、私はconstを知っています、他のものはどうですか?
最初の形式は、copy()
関数のパラメーターである参照にバインドされたCircle
オブジェクト(の状態)が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
関数を呼び出すこともできます。これはクラス 'Circle'のメンバー関数でなければなりません。
次に、次のものを検討します。
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;//定数メンバー関数と名付けられたこのponiter値は変更できません