このようなものの違いは何ですか
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;
};
const
オブジェクトがobj
ありX
、のbar()
ように呼び出すとobj.bar(obj)
、何が起こるはずで、なぜですか?呼び出し元で宣言されているobj._x = 42
ので、失敗するべきではありませんか?obj
const
void bar(X const& obj) {...}
)をこのようにした場合はどうでしょうか?void bar(const X& obj) {...}
、const
キーワードをこの場所に移動すると、何か変更がありますか?もしそうなら、この例も追加していただけますか?
const
左側にあるもの、または左側に何もない場合は右側にあるものに適用されます。あなたの場合、両方のバージョンconst
がに適用されていることがわかりますX
。
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オブジェクトでメソッドを呼び出すことができ、メソッドは呼び出されたオブジェクトを変更できません(少なくとも通常のチャネル経由ではありません)。
friend
部分を無視することにしました。なぜなら、それは実際にはOPの実際の質問(またはすべての問題が明らかになったときに実際の質問がどうなるか)とは無関係だと思うからです。だからそれでいい。
Circle copy(Circle&) const;
関数const
自体を作成します。これは、クラス/構造体のメンバー関数にのみ使用できます。
メンバー関数を作成するconst
ということは、
const
(対象const
オブジェクトのみ呼び出すことができるconst
機能を)。非constオブジェクトもconst
関数を呼び出すことができます。次のことを考えてみましょう。
Circle copy(const Circle &);
これは、渡されたパラメーターを関数内で変更できないことを意味します。クラスのメンバー関数である場合とそうでない場合があります。
注:const
同じ関数の非constバージョンを持つような方法で関数をオーバーロードすることが可能です。
関連するすべての混乱を解消しましょう const
const
一定の意味から来たのは、何かが変更可能ではなく、読み取り可能であることを意味します。
変数をconst
キーワードで修飾すると、後で変更することはできません。
たとえば、const変数は、宣言時に初期化する必要があります。
const
int var =25;
var =50; // gives error
ポインタ変数をafterで修飾すると、ポインタ自体を変更することはできませんが、ポインタの内容は変更可能です。
例
//しかしconst
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
我々が私達のポインタ変数を修飾する場合は前に我々はできる、ポインタ自体を変更するが、ポインタの内容は変更できません。
例
//しかしconst
*
int
const
* ptr = new int(85);
//or
const
int * ptr = new int(85);
ptr = new int; // allowed
*ptr=5445; // gives error
ポインタとコンテンツの両方定数
など
int
const
*
const
ptr = new int(85);
//or
const
int *
const
ptr = new int(85);
ptr = new int; // not allowed
*ptr=5445; // not allowed
Circle copy(const Circle &);
friend Circle copy(Circle&) const;
class A{ public :
int var;
void fun1()
{ var = 50; // allowed
}
void fun2()const
{ var=50; //not allowed
}
};
1つはパラメーターを参照し、もう1つは関数を参照します。
Circle copy(const Circle &);
これは、渡されたパラメータを関数内で変更できないことを意味します
Circle copy(Circle&) const;
const
修飾された関数は、メンバ関数やオブジェクトそのもののデータメンバーを変更することができないことを意味するために使用されています。あなたが投稿した例は無意味でした。
最初の関数をCircle copy(Circle const&);
、同じことを意味するように書き直すと、右から左に読むことが役立つことが明らかになります。オブジェクトへcopy
のconst
参照を取得し、参照によってCircle
オブジェクトを返す関数ですCircle
。