-2

C++ では、クラスの静的メンバー関数をそのクラスの静的メンバー変数constに関してどのように宣言しますか?

次の簡単な例を考えてみましょう。

myclass.h:

class myclass
{
    myclass()
    {
        myint = 0;
    }

    ~myclass() { }

    int myint;
    static int my_static_int;

    void foo(const int yourint) const;
    static void bar(const int newint );
};

myclass.cpp:

myclass::my_static_int = 0;

void myclass::foo(const int yourint) const
{
  if (yourint <= myint + my_static_int)
     std::cerr << "yourint  <= myint + my_static_int";
  else
      std::cerr << "yourint  >  myint + my_static_int";

  bar( yourint );
}

void myclass:bar(const int newint)
{
  my_static_int = newint;
}

main.cpp

...
myclass A;
A.foo(4);
A.foo(4);
..

出力は次のようになります。

yourint  >  myint + my_static_int
yourint  <= myint + my_static_int

明らかに、メンバー関数barで使用して、クラスの静的メンバー変数を変更し、 constメンバー関数の結果を変更できます。constfoo

barに関して const であると宣言できますmy_static_intか?

4

2 に答える 2

3

元のコード (書式を整えただけです):

class myclass
{
    myclass()
    {
        myint = 0;
    } 
    ~myclass()
    {}

    int myint;
    static int my_static_int;

    void foo(const int yourint) const;
    static void bar(const int newint );
};

このクラスでは、デフォルトではすべてがprivateアクセス不可であり、使用できません。

これは、実際のコードを投稿することが非常に重要である理由の 1 つの例です。

次に、次のように尋ねます。

bar「 ~constに関してであると宣言できますmy_static_intか?」

はい。ただし、そのための直接的な構文はありません。

既存の言語機能を使用する必要があります。

それらはタスクに適しています。

class something
{
private:
    int my_int;
public:
    void bar( int const newint ) const;
    something();
};

class myclass
{
private:
    int myint;
    static something;
public:
    void foo( int const yourint ) const;
    ~myclass() {}
    myclass(): myint( 0 ) {}
};
于 2013-02-04T18:47:32.080 に答える
2

bar を my_static_int に関して静的であると宣言できますか?

いいえ、C++ はそのようなメカニズムを提供していません。

const メンバー関数 foo を複数回呼び出してもクラス内の何も変更されないと想定されるため、これは非常に気になります。

と仮定してはいけません。const メソッドは静的変数を変更する場合があります。これらの変数は、const と宣言されているインスタンスの一部ではないためです。

とマークされた変数を変更することもできますmutable。または、 const-ness を使用して削除されたメンバーconst_cast

また、const関数はクラス外の変数を監視または変更できるため、const関数が呼び出されるたびに同じように動作するとは考えないでください。たとえば、const関数を返すことができます。rand()

C ++での意味をよりよく理解するには、この質問を参照してくださいconst

于 2013-02-04T18:42:23.990 に答える