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
キーワードによって生成されたエラーメッセージにより、デバッグに費やす時間を少し節約できます。
暗黙の変換が理にかなっているいくつかの状況は次のとおりです。
std::string
と同じ概念を反映するなど、概念的に引数に類似しているため、const char*
ここでの場合のように、暗黙的な変換は理にかなっています。std::string
文字列リテラルを渡すたびに明示的に作成する必要があることを考えてください。暗黙の変換があまり意味をなさないいくつかの状況は次のとおりです。
String
してint
。AnsiString
クラスは暗黙的にから構築するべきではありませんUnicodeString
。したがって、特定の場合の私のアドバイスは、クラスがstd::string
コードの重複に非常に似ており、コードの重複を最小限に抑えるため、意味があるので変換を使用することですが、将来的には、思考を伴う暗黙の変換を使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加