web-dev-qa-db-ja.com

パラメータの前のconstと関数名の後のconst c ++

このようなものの違いは何ですか

friend Circle copy(const Circle &);

そしてこのようなもの

friend Circle copy(Circle&) const;

関数が呼び出されたオブジェクトを変更しようとしないことをコンパイラに伝えるために関数が使用された後、私はconstを知っています、他のものはどうですか?

61
jazzybazz

最初の形式は、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;
};
154
Andy Prowl

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);

つまり、末尾のconstthisパラメーターをconstにします。つまり、クラス型のconstオブジェクトでメソッドを呼び出すことができ、メソッドは呼び出されたオブジェクトを変更できません。 (少なくとも、通常のチャネル経由ではありません)。

50
John Zwinck
Circle copy(Circle&) const;

関数const自体を作成します。これは、クラス/構造体のメンバー関数にのみ使用できます。

メンバー関数constを作成するということは、

  • 非constメンバー関数を呼び出すことはできません
  • メンバー変数を変更することはできません。
  • constオブジェクトから呼び出すことができます(constオブジェクトはconst関数のみを呼び出すことができます)。非constオブジェクトはconst関数を呼び出すこともできます。

これはクラス 'Circle'のメンバー関数でなければなりません。

次に、次のものを検討します。

Circle copy(const Circle &);

これは、渡されたパラメーターを関数内で変更できないことを意味します。これは、クラスのメンバー関数である場合とそうでない場合があります。

注:同じ関数のconstと非constバージョンを持つように関数をオーバーロードすることが可能です。

6
Waqar Ahmed

1つはパラメーターを参照し、もう1つは関数を参照します。

_Circle copy(const Circle &);
_

これは、渡されたパラメーターを関数内で変更できないことを意味します

_Circle copy(Circle&) const;
_

const修飾関数はメンバー関数に使用され、オブジェクト自体のデータメンバーを変更できないことを意味します。投稿した例は無意味です。

右から左に読む

最初の関数をCircle copy(Circle const&);として書き換えると、同じことを意味するので、右から左に読むと便利になることが明らかになります。 copyは、constオブジェクトへのCircle参照を受け取り、参照によりCircleオブジェクトを返す関数です。

3

friend Circle copy(const Circle &); //は、関数の定数パラメーターを指します。パラメータによって保存された値を変更することはできません。

あなたの例で友人を削除する必要がありますCircle copy(Circle&)const;//定数メンバー関数と名付けられたこのponiter値は変更できません

0
shivakumar