2012-04-20 7 views
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; 
} 

どのような違いがありますか、どちらを使用しますか? typecastingが参照を返し、getKがコピーを返すかどうか疑問に思っています。C++ getとtypecastingの使い方の違いは何ですか?どちらを使うべきですか?

+1

Typecastingは、BigIntegerクラスのようにintに変換する方が適切です。 – chris

+0

@James 'int'は不変ですか?それはどういう意味ですか?確かにあなたはintの値を変更することができます... –

答えて

5

唯一の違いは、型キャスティングが暗黙的にできることです。

int i = a; 

C++ 11では、キャスト演算子を明示的に呼び出すことができます。

explicit operator int() { return k; } 
+0

それ以外の場合を除いて。あなたはC++を愛していませんか? – chris

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 
} 

:たとえば、あなたは多分、このような何かを行う可能性があります。

+1

これは簡単にC++ 11で解決されています。 'explicit operator int(){...}' – chris

+0

あなたは正しいです、型キャスト演算子は、システム定義オブジェクトとして使用されるユーザ定義オブジェクトの方が適切です。 OPの場合、アクセサメソッドはより理にかなっています。 – AJG85

0

戻り値の型が返されます。あなたが参照にキャストすると、それはあなたが戻ってくるものです。あなたが何をしているのかはコピーを作ることです。

「違い」は、あなたの方法がするものです。あなたの "キャスト"はそれに5を加えてそれを返すことができます。またはあなたが望むもの。

クリスが最初のコメントで言ったように、妥当性については、通常「あなたのクラスはありますか?タイプ質問。演算子は、クラスが何らかのものとして動作するので、一般的な変換のために実行する必要があります。単にクラスから何かを抽出するだけではありません。そのため、単に文字列クラスのキャストではなく、文字列を整数に変換する別の関数です。複素数型はdouble型やint型に直接キャストすることができますが、double型やint型の情報は削除されます。コンバージョンが「虐待」される可能性があるのは、現代の言語の中にはオペレータの過負荷が許されない理由があるからです。他の人は、虐待される可能性がある間にアプローチを取る、それは素晴らしいこともできます。これはC++の哲学です。すべてのツールを提供し、ユーザーがそれらを使って良いか悪いかを教えてください。

私はそれが理に適ったと思います。

関連する問題