2016-10-01 8 views
2

このメソッドで呼び出し元のオブジェクトが変更されていないことを示すには、クラスメソッドでキーワードconstを使用する必要があります。しかし、後者の正確なセマンティクスは何ですか?私は3つのオプションを考えることができます:クラスメソッドは、constのすべきかとどのメソッドをconstにする必要がありますか?

  1. (最も弱い)それは、オブジェクトの店舗のビットとバイトを変更しない場合にのみ
  2. (強い)、それはオブジェクトを変更しません。 (1におけるように)、またはないオブジェクトによって所有され、参照オブジェクト
  3. (最強)それが参照するオブジェクトともしない任意のオブジェクト変更(それが所有されているかどうかを問わず)ない

"正しい"方法は何ですか?プログラミングコミュニティの間で共通の合意がありますか?

たとえば、標準ライブラリのコンテナのconstセマンティクスは、明らかに少なくとも2つを満たしています。他方、不思議なことにstd :: unique_ptrの*演算子は2も満たさない:constであるが、pointed to objectへの非const参照を返すが、オブジェクトはstd :: unique_ptrオブジェクト定義により。

もう一つの例:2続き

class X 
{ 
private: 
    int& intref; 

public: 
    X(int& intref): intref(intref) {}; 

    void modifyRef(int& another) const 
    { 
     this->intref = another; 
    } 
}; 

、法上のconstがオブジェクトによって所有されていないINTREF参照何か以来、okです。 3に続いて、constを削除する必要があります。

+1

「constキーワードを示すために、クラスメソッドで使用する必要がありますこのメソッドで呼び出し元オブジェクトが変更されていないことを確認してください。 - ***違う***。このメソッドで***オブジェクト***が変更されていないことを示します。 –

+0

もう少しレベルを下げていく、0(論理的な制約)オブジェクトの状態を不透明に変更するところ。 – gjha

+0

@gjhaこれは、1つ下のレベルではなく、横にあるステップです。 – Deduplicator

答えて

2

これら3つのいずれも

はC++ const論理一定ではなく、 物理定数を意味することに注意してください。

当然のことながら、オブジェクトが定数として宣言されている場合は、mutableのメンバを変更することができますが、それ以外は論理的な状態を保存するだけです。

したがって、オブジェクトの論理状態が変更されますか?

+0

私は前にそれを知らなかったので、C++ constは論理定数を意味することを覚えていないことを恥ずかしく思います。しかし、私はその点を見ている。直感的にそれを直感的に使っていたと思うし、メソッド上でconstを使うためのルールを設定しようとしていたときに混乱していました(上記3ポイントにつながります)。私は、論理的な程度についてさらに詳しくお伝えします。 –

+0

クラスメソッドのconstは、主にpublicクラスのためのものであるか、それともプライベートメソッドのために使うべきか? –

+0

全体的にconst-correctでない場合、動作しません。だから、プライベートメソッドのためにもやってください。 – Deduplicator

1

レベル0(論理的な定数)オブジェクトの状態を不透明に変更することが許可されている場所。

Cacheクラスの例を考えてみましょう。これはfind()メソッドを持ち、ローカルマップ内の要素を見つけ、ローカルマップ内でそれを探し出してDBなどで検索しませんでした。取得された値を持つローカルマップ。

ここでCacheのメソッドのメソッドはconstであり、クラスのためのよりクリーンなインターフェイスを提供します。クラスのユーザは、要素検索の内部メカニズムに煩わされることはありません。

あなたが提供している例がlogical const-ness

関連する問題