121

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

friend Circle copy(const Circle &);

そして、このようなもの

friend Circle copy(Circle&) const;

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

4

7 に答える 7

249

最初の形式はCircle、関数のパラメーターである参照にバインドされたオブジェクト(の状態) が、その参照copy()によって変更されないことcopy()を意味します。参照は への参照であるため、それ自体が として修飾されていないその参照を介してconstのメンバー関数を呼び出すことはできません。Circleconst

一方、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;
};
于 2013-04-14T12:36:51.830 に答える
88

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 オブジェクトでメソッドを呼び出すことができ、メソッドが呼び出されたオブジェクトを (少なくとも、通常のチャネルを介してではなく) 変更できないことを意味します。

于 2013-04-14T12:38:58.347 に答える
12
Circle copy(Circle&) const;

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

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

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

次に、次のものを検討してください。

Circle copy(const Circle &);

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

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

于 2013-04-14T12:49:29.487 に答える
4

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

Circle copy(const Circle &);

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

Circle copy(Circle&) const;

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

右から左に読む

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

于 2013-04-14T12:35:52.520 に答える
0

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

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

于 2013-04-14T12:38:54.030 に答える
0
friend Circle copy(const Circle &);

パラメータの値は、関数呼び出し中に変更されません。

friend Circle copy(const Circle &)const ; 

この関数は、クラス メンバーの値を変更しないアクセサーです。一般に、アクセサーとミューテーターという関数のタイプがあります。アクセサー: オブジェクトの状態を調べますが、変更しません。

于 2019-02-01T22:40:10.723 に答える