39

以下の「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++;
   }
};
4

5 に答える 5

39

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

特別な変換関数を明示的に呼び出すことなく、カスタムINTタイプから別のタイプ(この場合は)に変換する方法を提供します。int

たとえば、convert演算子を使用すると、次のコードがコンパイルされます。

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
于 2010-09-28T16:44:48.173 に答える
17

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.
于 2010-09-28T16:46:04.007 に答える
6

まず最初に:

$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 のメンバー関数 [...]

演算子変換タイプ ID

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

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

int y1 = i; // copy initialization or
int y2(i);  // direct initialization
double d = (int )i; // explicit cast
于 2010-10-05T02:11:51.383 に答える
3

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

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

于 2010-09-28T16:22:32.070 に答える
2

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

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

    Foo operator++ {} // Operation ++ on foo like:
    // Foo foo;
    // foo++;
};
于 2010-09-28T16:25:25.670 に答える