この場合、コンストラクターまたは明示的な関数を介したより良い暗黙の変換は何ですか?

こんにちは。お元気ですか

String学習目的でのみC ++使用するための独自のクラスを作成しています。

そして、私は決断を下すべき場所に固執しました。その件を説明させてください。

クラスには2つの選択肢があります。手元の問題からあなたの気をそらしたくないので、以下にコードの関連部分のみを投稿します。私を助けるためにあなたがより多くの情報を必要とするならば、私は喜んでそれを提供します。

オプション1

class String {
    size_t _length;
    char* _stringHead;
public:
    String(const std::string&);
    String(const char*);
    String(const char);
};
String operator+(String, const String);

const bool operator==(const String, const String);
const bool operator!=(const String, const String);
const bool operator<(const String, const String);
const bool operator<=(const String, const String);
const bool operator>(const String, const String);
const bool operator>=(const String, const String);

オプション2

class String {
    size_t _length;
    char* _stringHead;
public:
    //irrelevant part of code in Option 2
    String(const std::string&);
    String(const char*);
    String(const char);
    //irrelevant part of code in Option 2
};
String operator+(String, const String&);

const bool operator==(const String&, const String&);
const bool operator!=(const String&, const String&);
const bool operator<(const String&, const String&);
const bool operator<=(const String&, const String&);
const bool operator>(const String&, const String&);
const bool operator>=(const String&, const String&);

//for std::string
String operator+(String, const std::string&);

const bool operator==(const String&, const std::string&);
const bool operator!=(const String&, const std::string&);
const bool operator<(const String&, const std::string&);
const bool operator<=(const String&, const std::string&);
const bool operator>(const String&, const std::string&);
const bool operator>=(const String&, const std::string&);

String operator+(const std::string&, String);

const bool operator==(const std::string&, const String&);
const bool operator!=(const std::string&, const String&);
const bool operator<(const std::string&, const String&);
const bool operator<=(const std::string&, const String&);
const bool operator>(const std::string&, const String&);
const bool operator>=(const std::string&, const String&);
//for std::string

//the same goes for char* and char
...
//the same goes for char* and char

したがって、オプション1オプション2の仕様からわかるように、ここでの決定は、コンストラクターを使用して行われる暗黙の型変換を使用するか、文字列型を使用する型ごとに各ユーティリティを個別に入力するかについてです。作業。

私が今見る限り、最初のアプローチを使用する利点は、実装と保守が簡単なことです。2番目のアプローチでは、パフォーマンスの結果が向上する可能性があります。

どのアプローチが優れているのか、どのシナリオでどのアプローチを使用するのか、建設的な議論をしたいと思います。ここで私が興味を持っている最大の部分は、2番目のアプローチのパフォーマンス上の利点が妥当であるかどうかだと思います。

バルドリニウム

暗黙のコンストラクターは、パラメーター型のインスタンスをクラス型を予期するメソッドに渡すときに、クラス型のインスタンス作成するために使用されますこの暗黙の変換は、クラスのコンストラクターを呼び出すことによって行われます。

たとえば、次のようなコードを実行します。

#include <iostream>

class String {
 public:
  String(const std::string& s) {
    std::cout << "called" << std::endl;
  };
};

std::ostream& operator<< (std::ostream& stream, const String& s) {
  return stream;
}

void hello(String s) {
  std::cout << "Hello " << s; // Outputs "called" before "Hello ".
}

int main() {
  std::string s = "world";
  hello(s); // Uses the implicit conversion constructor.
}

クラスの新しいインスタンスをString毎回作成する必要があるため、パフォーマンスがわずかに低下することが予想されますしかし、私の意見では、利点を上回るには十分ではありません。暗黙の変換により、クラス設計者の仕事が大幅に簡素化され、クラスの使用が容易になります。

ただし、変換が自動的に行われた場合、変換の存在によって支援されるよりも、チームメンバーが驚かれる可能性が高い状況が存在することに注意してください。

これがそのような例です:

#include <iostream>

class String {
 public:
  String(int size) {};
};

std::ostream& operator<< (std::ostream& stream, const String& s) {
    return stream;
}

void hello(String s) {
  std::cout << "Hello " << s; // Prints "Hello " as no error occurs.
}

int main() {
  hello(10); // It still calls the implicit conversion constructor.
}

上記のコードでは、explicitキーワードによって生成されたエラーメッセージにより、デバッグに費やす時間を少し節約できます。

暗黙の変換が理にかなっているいくつかの状況は次のとおりです。

  1. クラスは構築するのに十分安価なので、暗黙的に構築されてもかまいません。
  2. 一部のクラスは暗黙的に変換できるのstd::stringと同じ概念反映するなど、概念的に引数類似しているため、const char*ここでの場合のように、暗黙的な変換は理にかなっています。
  3. 一部のクラスは、暗黙的な変換が無効になっていると、使用するのがはるかに不快になります。std::string文字列リテラルを渡すたびに明示的に作成する必要があることを考えてください

暗黙の変換があまり意味をなさないいくつかの状況は次のとおりです。

  1. 建設は高価です。
  2. クラスは、概念的には引数とは非常に異なります。例を検討Stringしてint
  3. 建設には望ましくない副作用が生じる可能性があります。たとえば、UnicodeからANSIへの変換では情報が失われる可能性があるためAnsiStringクラスは暗黙的にから構築するべきではありませんUnicodeString

したがって、特定の場合の私のアドバイスは、クラスがstd::stringコードの重複に非常に似ており、コードの重複を最小限に抑えるため、意味があるので変換を使用することですが、将来的には、思考を伴う暗黙の変換を使用します

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コピーコンストラクター/ oper =のみを定義した場合、ムーブコンストラクター/ムーブ代入が暗黙的に宣言および削除済みとして定義されないのはなぜですか?

分類Dev

引数で暗黙の型変換のためのコンストラクターを定義する方法は?

分類Dev

暗黙のスーパーコンストラクターNum()は、デフォルトコンストラクターに対して未定義です。明示的なコンストラクターを定義する必要があります。この背後にあるロジックは何ですか

分類Dev

暗黙のコンストラクター呼び出しまたは何ですか?

分類Dev

なぜこれは変換コンストラクターに暗黙のキャストを行わないのですか?

分類Dev

コピーコンストラクターを削除した場合、暗黙の移動コンストラクターは取得されませんか?

分類Dev

暗黙的および明示的に削除された移動コンストラクターの処理が異なるのはなぜですか?

分類Dev

printf()にそれぞれのフォーマット指定子に対して誤った引数タイプが与えられた場合、Cコンパイラはそれを暗黙的に変換しようとしますか?

分類Dev

std :: bindの戻り値の型は、2つの異なる明示的なコンストラクターに暗黙的に変換可能です

分類Dev

PresenterクラスでActvityのコンテキストにアクセスすることは良い習慣ですか?そうでない場合、それを行うための他のより良い方法はありますか?

分類Dev

テンプレート化された関数パラメーターに暗黙の変換が適用されないのはなぜですか?

分類Dev

ハイパフォーマンスコンピューティングのより良い方法は何ですか:データの構造体を関数または変数のセットに渡しますか?

分類Dev

変換コンストラクターの引数を暗黙的に変換できますか?

分類Dev

kotlinを使用したspringbootテストで@Autowiredコンストラクターを使用する場合と使用しない場合の違いは何ですか

分類Dev

このエラーが発生します。タイプ「double」を「decimal」に暗黙的に変換することはできません。明示的な会話が存在します(キャストが不足していますか?)

分類Dev

ミューテックスをメンバー変数として使用するにはどうすればよいですか?'simple_encoder'のコピーコンストラクタがないと暗黙的に削除されます

分類Dev

インターフェイスに複数のジェネリックパラメータがある場合、「[type]を[interface]に暗黙的に変換できません」エラーを解決するにはどうすればよいですか?

分類Dev

置き換えられたコンパイラが提供する暗黙のコンパニオンオブジェクトと同じように動作するケースクラスの明示的なコンパニオンオブジェクトを作成するにはどうすればよいですか?

分類Dev

リストにインデックスを付けるときにPython3.xが暗黙的にバイトを他のクラスに変換しないようにするための組み込みの方法は何ですか?

分類Dev

同様に優れた変換関数が利用できるのに、オーバーロード解決が特別でないコンストラクターよりも移動コンストラクターを好むのはなぜですか?

分類Dev

クラス変数がc#のコンストラクターによって受信された仮パラメーターと同じである場合、誰かがより良い命名スキームを提案できますか?

分類Dev

この場合、何が良いですか:分類またはクラスタリング?

分類Dev

三項は、明示的なコピーコンストラクターを暗黙的に呼び出すことを許可されていますか?

分類Dev

このクラスが暗黙的にポインタに変換されないのはなぜですか?

分類Dev

React JSでコンストラクターと独自の状態を持つ子を持つことは良い習慣ですか?または、この場合、小道具を使用する必要がありますか?

分類Dev

IoCコンテナを使用していない場合、クラスの依存関係を公開するためのシングルトンパターンよりも優れたオプションはありますか?

分類Dev

メソッド/コンストラクター引数を介した暗黙的な使用と暗黙的な使用

分類Dev

クラスが暗黙的に依存している場合に、クラスをオブジェクトに変換する慣用的な方法はありますか?

分類Dev

Delphiコンパイラはいつ暗黙のインターフェイス変数を作成しますか?

Related 関連記事

  1. 1

    コピーコンストラクター/ oper =のみを定義した場合、ムーブコンストラクター/ムーブ代入が暗黙的に宣言および削除済みとして定義されないのはなぜですか?

  2. 2

    引数で暗黙の型変換のためのコンストラクターを定義する方法は?

  3. 3

    暗黙のスーパーコンストラクターNum()は、デフォルトコンストラクターに対して未定義です。明示的なコンストラクターを定義する必要があります。この背後にあるロジックは何ですか

  4. 4

    暗黙のコンストラクター呼び出しまたは何ですか?

  5. 5

    なぜこれは変換コンストラクターに暗黙のキャストを行わないのですか?

  6. 6

    コピーコンストラクターを削除した場合、暗黙の移動コンストラクターは取得されませんか?

  7. 7

    暗黙的および明示的に削除された移動コンストラクターの処理が異なるのはなぜですか?

  8. 8

    printf()にそれぞれのフォーマット指定子に対して誤った引数タイプが与えられた場合、Cコンパイラはそれを暗黙的に変換しようとしますか?

  9. 9

    std :: bindの戻り値の型は、2つの異なる明示的なコンストラクターに暗黙的に変換可能です

  10. 10

    PresenterクラスでActvityのコンテキストにアクセスすることは良い習慣ですか?そうでない場合、それを行うための他のより良い方法はありますか?

  11. 11

    テンプレート化された関数パラメーターに暗黙の変換が適用されないのはなぜですか?

  12. 12

    ハイパフォーマンスコンピューティングのより良い方法は何ですか:データの構造体を関数または変数のセットに渡しますか?

  13. 13

    変換コンストラクターの引数を暗黙的に変換できますか?

  14. 14

    kotlinを使用したspringbootテストで@Autowiredコンストラクターを使用する場合と使用しない場合の違いは何ですか

  15. 15

    このエラーが発生します。タイプ「double」を「decimal」に暗黙的に変換することはできません。明示的な会話が存在します(キャストが不足していますか?)

  16. 16

    ミューテックスをメンバー変数として使用するにはどうすればよいですか?'simple_encoder'のコピーコンストラクタがないと暗黙的に削除されます

  17. 17

    インターフェイスに複数のジェネリックパラメータがある場合、「[type]を[interface]に暗黙的に変換できません」エラーを解決するにはどうすればよいですか?

  18. 18

    置き換えられたコンパイラが提供する暗黙のコンパニオンオブジェクトと同じように動作するケースクラスの明示的なコンパニオンオブジェクトを作成するにはどうすればよいですか?

  19. 19

    リストにインデックスを付けるときにPython3.xが暗黙的にバイトを他のクラスに変換しないようにするための組み込みの方法は何ですか?

  20. 20

    同様に優れた変換関数が利用できるのに、オーバーロード解決が特別でないコンストラクターよりも移動コンストラクターを好むのはなぜですか?

  21. 21

    クラス変数がc#のコンストラクターによって受信された仮パラメーターと同じである場合、誰かがより良い命名スキームを提案できますか?

  22. 22

    この場合、何が良いですか:分類またはクラスタリング?

  23. 23

    三項は、明示的なコピーコンストラクターを暗黙的に呼び出すことを許可されていますか?

  24. 24

    このクラスが暗黙的にポインタに変換されないのはなぜですか?

  25. 25

    React JSでコンストラクターと独自の状態を持つ子を持つことは良い習慣ですか?または、この場合、小道具を使用する必要がありますか?

  26. 26

    IoCコンテナを使用していない場合、クラスの依存関係を公開するためのシングルトンパターンよりも優れたオプションはありますか?

  27. 27

    メソッド/コンストラクター引数を介した暗黙的な使用と暗黙的な使用

  28. 28

    クラスが暗黙的に依存している場合に、クラスをオブジェクトに変換する慣用的な方法はありますか?

  29. 29

    Delphiコンパイラはいつ暗黙のインターフェイス変数を作成しますか?

ホットタグ

アーカイブ