12

最近、O'ReillyMediaのC++ Pocket Referenceのコピーを閲覧していましたが、ユーザー定義型のユーザー定義変換に関する簡単なセクションと例に出くわしたとき、驚きました。

#include <iostream>

class account {

    private:
        double balance;

    public:
        account (double b) { balance = b; }

        operator double (void) { return balance; }
};

int main (void) {

    account acc(100.0);
    double balance = acc;

    std::cout << balance << std::endl;

    return 0;
}

私はしばらくの間C++でプログラミングしてきましたが、この種の演算子のオーバーロードを見たのはこれが初めてです。この主題に関する本の説明はやや簡潔であり、この機能に関するいくつかの未回答の質問が残っています。

  • これは特にあいまいな機能ですか?私が言ったように、私はしばらくの間C ++でプログラミングしてきましたが、これに出くわしたのはこれが初めてです。私はこれに関してもっと詳細な資料を見つけることができませんでした。
  • これは比較的ポータブルですか?(私はGCC 4.1でコンパイルしています)
  • ユーザー定義のタイプへのユーザー定義の変換を行うことはできますか?例えば

    演算子std::string(){/*コード*/}

4

4 に答える 4

15

これは特にあいまいな機能ですか?

はい、変換演算子はあまり使用されません。私が見た場所は、組み込み型に劣化する可能性のあるユーザー定義型用です。原子番号タイプへの変換/原子番号タイプからの変換をサポートする固定精度の数値クラスのようなもの。

これは比較的ポータブルですか?

私の知る限りではそうです。彼らは永遠に標準になっています。

ユーザー定義のタイプへのユーザー定義の変換を行うことはできますか?

はい、それはコンストラクターの機能の1つです。単一の引数を取るコンストラクターは、引数の型からクラスの型への変換演算子を効果的に作成します。たとえば、次のようなクラス:

class Foo {
public:
    Foo(int n) {
        // do stuff...
    }
}

やってみましょう:

Foo f = 123;

以前に使用std::stringしたことがある場合は、この機能を気付かずに使用した可能性があります。(余談ですが、この動作を防ぎたい場合は、を使用して単一引数のコンストラクターを宣言してexplicitください。)

于 2010-06-09T18:30:40.100 に答える
5

特にあいまいではありません。非常に移植性が高く(結局のところ言語の一部です)、ユーザー定義型への変換が可能です。

注意点として、暗黙の変換パスが多数あると、予期しない変換が呼び出され、驚くべきバグが発生する可能性があります。また、いくつかのユーザー定義型間で非明示的な変換コンストラクターと変換関数を使用すると、よりあいまいな変換シーケンスが発生する可能性があり、解決するのが困難になる可能性があります。

于 2010-06-09T18:30:28.370 に答える
4

これは、C ++を学んでいたときに最初に遭遇したことのひとつだったので、いいえ、それはそれほど曖昧ではありません。

ただし、注意したいことが1つありexplicitます。何をしているのかを正確に理解していない限り、キーワードを一緒に使用してください。暗黙的な変換により、コードが予期しない方法で動作する可能性があるため、ほとんどの場合、それらを使用しないようにする必要があります。率直に言って、言語にそれらがなかったら、私はもっと幸せになるでしょう。

于 2010-06-09T18:32:38.193 に答える
3

これは特に便利な標準のC++機能であり、少しわかりにくいものではありません:)変換演算子には、基本型とユーザー定義型を同様に使用できます。

于 2010-06-09T18:30:31.697 に答える