4

簡単な例として、次のクラスを考えてみましょう。

#include <iostream>
#include <string>
using namespace std;

class point {
public:
    int _x{ 0 };
    int _y{ 0 };

    point() {}
    point(int x, int y) : _x{ x }, _y{ y } {}
    operator string() const
        { return '[' + to_string(_x) + ',' + to_string(_y) + ']'; }

    friend ostream& operator<<(ostream& os, const point& p) {

        // Which one? Why?
        os << static_cast<string>(p); // Option 1
        os << p.operator string();    // Option 2

        return os;
    }
};

変換演算子を直接呼び出す必要がありますか、それとも単に呼び出しstatic_castてそれで処理を任せるべきでしょうか?

これら 2 つの行はほとんど同じことを行います (つまり、変換演算子を呼び出します)。私が知る限り、これらの動作に実際の違いはありません。したがって、ここでの本当の問題は、それが本当かどうかです。これらは私には同じように見えますが、理解できない微妙な違いがまだある可能性があります.

では、構文が異なるという事実以外に、これらのアプローチ (この例には当てはまらない可能性があるものも含む) の間に実際的な違いはありますか? どちらを優先する必要がありますか?その理由は?

4

2 に答える 2

5

これらのアプローチの間に実際的な違いはありますか

この場合、私が知っていることではありませんが、賢明な行動です。

(この例に当てはまらないものも含む)

static_cast<X>(instance_of_Y)Xtype の変換コンストラクターがある場合は、変換も許可されYます。の (存在しない可能性がある) 変換演算子への明示的な呼び出しYは、言及された変換コンストラクターを使用できませんでした。もちろん、この場合、 にstd::stringは の変換コンストラクタがありませんpoint

したがって、キャストはより一般的であり、それが私が一般的に好むものです。また、「このオブジェクトを型に変換するstring」は、 「オペレーターを呼び出す」string()よりも意味があります。しかし、何らかの非常に奇妙な理由で変換コンストラクターを回避したい場合は、変換演算子を明示的に呼び出すことでそれを実現できます。

于 2016-06-04T11:22:17.897 に答える
2

いいえ、変換演算子メンバー関数を直接呼び出す必要はありません。

オブジェクトが期待されるクラスのインスタンスを使用するとstd::string、変換演算子がコンパイラによって自動的に呼び出されます。static_castたとえば、インスタンスを にキャストする場合などstd::stringです。

シンプルでばかげた例:

void print_string(std::string const& s)
{
    std::cout << s << '\n';
}

int main()
{
    point p(1, 2);

    print_string(p);  // Will call the conversion operator
    print_string(static_cast<std::string>(p));  // Will call the conversion operator too
}

必要になる関数を直接呼び出すのに最も近いのは、 のようなものを使用することですstatic_cast


特定のケースでは、出力演算子を使用して、 を使用する必要がありますstatic_cast。その理由は意味論的であり、コードの将来の読者とメンテナー (あなた自身を含む可能性があります) のためです。

もちろん、変換メンバー関数を直接呼び出すこともできますが (オプション 2)、「ここでオブジェクトを文字列に変換しています」というセマンティック情報が失われます。

変換演算子の唯一の用途が出力演算子での使用である場合は、出力ストリーム参照を引数として取り、ストリームに直接書き込み、出力からその関数を呼び出す (プライベート) 関数を作成することもできます。オペレーター。

于 2016-06-04T11:17:48.420 に答える