0

私はこれらのコードを持っています

#include <iostream>
using namespace std;
class Ex;
class Exx;

class Ex {
public:
    int _val;
    int const *_p_val;
    void setPtrVal(int * const &val) {
        _p_val=val;
    }
};

class Exx {
public:
    Ex const *_ex;
    void setEx(Ex const &ex)
    {
        _ex=&ex;
    }
};

int main()
{
    Ex x;
    int i=10;
    x.setPtrVal(&i);
    Exx xx;
    xx.setEx(x);
    int y=20;
    cout<<*(xx._ex->_p_val)<<endl;
    x.setPtrVal(&y);
    cout<<*(xx._ex->_p_val)<<endl;
    cout<<*x._p_val<<endl;
    return 0;
}

1: ご覧のとおり、Ex xはEx classの const ではありません。およびEx const *_ex; Ex constのみへのポインターポイントです。上記のすべてが大丈夫なのはなぜですか?

2: void setEx(Ex const &ex)の constは、関数本体で ex を変更できないことを意味しますか?

3:上記のようなプロトタイプが必要な場合、メンバーポインタ変数のセッター関数を修正するにはどうすればよいですか(セキュリティ上の理由からと仮定します)?

わかった。if Ex const *_ex; Ex *_exになる 。したがって、セッター関数では、上記のように、プロトタイプが引数オブジェクトを変更しないようにする必要があります。機能体はどうなる?

4

2 に答える 2

0

まず、あなたは実際にはvoid setEx(Ex const &ex)正しいsetExです&ex

これは、指し示されている (またはあなたの場合は参照されている) ものが、呼び出し元のコードで既に const されているものであるとは限りません。

次に、何が最高かというと、それはあなたが実際に何を望んでいるかによります。メンバーに対して記述する場合Ex const* ex;、オブジェクトの初期化によって設定されると、オブジェクト自体 (メンバー関数によって) が指すデータを変更できないことを意味します。ポインターに新しい値を代入することはできますが (別の場所を指すようにすることもできます)、つまり、指している対象を変更することはできません。

最後に、それはあなたが望むものになります。

  • データを変更してはならない場合 :Ex const * ex;それを強制します。
  • ポインターを変更してはならない場合は、Ex * const ex;それを強制します。
  • ポインターとデータの両方をそのままにしておく必要がある場合は、 : で十分Ex const * const ex;です。
于 2013-08-23T15:27:54.697 に答える