web-dev-qa-db-ja.com

「operator int」関数とは何ですか?

以下の「operator int」関数とは何ですか?それは何をするためのものか?

class INT
{
   int a;

public:
   INT(int ix = 0)
   {
      a = ix;
   }

   /* Starting here: */
   operator int()
   {
      return a;
   }
   /* End */

   INT operator ++(int)
   {
      return a++;
   }
};
33
ankit

太字のコードは変換演算子です。 (別名 キャスト演算子

これにより、特別な変換関数を明示的に呼び出さなくても、カスタムのINT型から別の型(この場合はint)に変換できます。

たとえば、変換演算子を使用すると、このコードはコンパイルされます。

INT i(1234);
int i_2 = i; // this will implicitly call INT::operator int()

変換演算子がないと、上記のコードはコンパイルされず、INTからintに移動するには、次のような別のことを行う必要があります。

INT i(1234);
int i_2 = i.a;  // this wont compile because a is private
27
John Dibling

operator int()変換演算子であり、このクラスをintの代わりに使用できます。このタイプのオブジェクトがint(または他の数値タイプ)が予想される場所で使用される場合、このコードは正しいタイプの値を取得するために使用されます。

例えば:

int i(1);
INT I(2); // Initialised with constructor; I.a == 2
i = I;    // I is converted to an int using `operator int()`, returning 2.
16
Mike Seymour

まず最初に:

$ 12.3.1/1-「関数指定子を明示的に指定せずに宣言されたコンストラクターは、パラメーターの型からクラスの型への変換を指定します。このようなコンストラクターは、変換コンストラクターと呼ばれます。」

あなたの例では、INTは 'int'からの変換コンストラクターを持つユーザー定義クラスです。

したがって、次のコードは整形式です。

INT i(1024);     // direct initialization syntax

つまり、整数からINTオブジェクトを取得できます。ただし、INTオブジェクトを整数に戻す必要がある場合はどうすればよいでしょうか。推移性?

INTクラスは、カプセル化された整数メンバーを返すメンバー関数を提供できると言えます

int x = i.geta();

ただし、これはあまり直感的ではなく、標準化されたアプローチではありません。また、そのような状況で組み込み型がどのように機能するかについても直観的ではありません。

int z = 0;
int y1 = z; // copy initialization or
int y2(z);  // direct initialization
double d = (int )z; // explicit cast

そのため、標準は、次のように言うことにより、ユーザー定義型を変換するこのような標準化と直感性を可能にします。

$ 12.3/2-"フォームXの名前を持つパラメーターを持たないクラスXのメンバー関数[...]

演算子変換タイプID

[...] Xからconversion-type-idで指定されたタイプへの変換を指定します。このような関数は、変換関数と呼ばれます。戻り値の型は指定できません。変換関数がメンバー関数である場合、変換関数のタイプ(8.3.5)は、「パラメーターを取らず、conversion-type-idを返す関数」です。

これにより、以下のすべてが整形式になり、組み込み型の動作方法との調和が保たれますになります。

int y1 = i; // copy initialization or
int y2(i);  // direct initialization
double d = (int )i; // explicit cast
4
Chubsdad

他のいくつかの演算子がまだ定義されていないだけで、通常のintのように動作するINTクラスを作成するように見えます。

これは宿題の問題ですか?

4
John Smith

教室からの質問のようですので、クラスの作成方法に関するドキュメントを確認してください。

class Foo
{
public
    Foo() {} // Constructor

    Foo operator++ {} // Operation ++ on foo like:
    // Foo foo;
    // foo++;
};
2
Wernight