2
#include <iosteam>
using namespace std;

Class A
{
  int k;

public:

  int getK() { return k; }

  operator int() { return k; }

};

int main()
{
  A a;
  cout << a.getK() << " " << int(a) << endl;
}

違いは何ですか? どちらを使用すればよいですか? 型キャストが参照を返し、getK がコピーを返すかどうか疑問に思っています。

4

3 に答える 3

5

唯一の違いは、型キャストを暗黙的にできることです。

int i = a;

C++11 では、キャスト演算子を強制的に明示的に呼び出すことができることに注意してください。

explicit operator int() { return k; }
于 2012-04-20T17:33:54.513 に答える
1

どちらも復刻版です。通常、キャスト演算子を提供するのは、キャストが必要な場合です。たとえば、次のようなことをするかもしれません:

#include <iosteam>
using namespace std;

Class A
{
  double k;

public:
  A(double v) : k(v) {}
  double getK() { return k; }
  operator int() { return static_cast<int>(k); }
};

int main()
{
  A a(3.14);
  cout << a.getK() << " " << int(a) << endl; // 3.14 3
}

一般に、私は明示的なキャストを好むので、キャスト演算子を完全に避けます。

于 2012-04-20T17:34:19.410 に答える
0

戻り値の型を返します。参照にキャストすると、それが返されます。どちらの場合も、コピーを作成しています。

「違い」は、メソッドが行うことです。あなたの「キャスト」はそれに5を追加してから返すことができます。またはあなたが望むもの。

妥当性については、chris が最初のコメントで言ったように、通常は「あなたのクラスは a かどうか」です。タイプの質問。クラスから何かを抽出するだけでなく、クラスが何かとして動作するため、演算子は一般的な変換に対して実行する必要があります。そのため、文字列クラスの単なるキャストではなく、文字列を整数に変換する別の関数になっています。一方、複素数型は double または int に直接キャストできますが、それによって情報が取り除かれます。変換が「悪用」される可能性があるということは、実際には、一部の最新の言語で演算子のオーバーロードが許可されていない理由です。他の人は、悪用される可能性がありますが、素晴らしいこともあります。これが、ほとんどの場合の C++ の哲学です。すべてのツールを提供し、ユーザーがそれらを使って良いことも悪いこともできるようにします。

それが理にかなっていることを願っています。

于 2012-04-20T17:36:20.763 に答える