C++コード(下図を参照)に空の文字列として初期化された文字列がある場合、どのように問題になりますか?
std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
// do something
}
vs no/null初期化:
std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
// do something
}
これに関するベストプラクティスや落とし穴はありますか?
std::string:
にempty()
準備ができている関数があります
std::string a;
if(a.empty())
{
//do stuff. You will enter this block if the string is declared like this
}
または
std::string a;
if(!a.empty())
{
//You will not enter this block now
}
a = "42";
if(!a.empty())
{
//And now you will enter this block.
}
落とし穴はありません。 std::string
のデフォルトの構成は""
です。ただし、文字列をNULL
と比較することはできません。最も近い方法は、std::string::empty
メソッドを使用して、文字列が空かどうかを確認することです。
ベスト:
std::string subCondition;
これにより、空の文字列が作成されます。
この:
std::string myStr = "";
コピーの初期化を行います-""
から一時的な文字列を作成し、コピーコンストラクターを使用してmyStr
を作成します。
ボーナス:
std::string myStr("");
直接初期化を行い、string(const char*)
コンストラクターを使用します。
文字列が空かどうかを確認するには、empty()
を使用します。
空性と「NULL性」は2つの異なる概念です。他の人が言及したように、前者はstd::string::empty()
を介して達成でき、後者はboost::optional<std::string>
を使用して達成できます。
boost::optional<string> myStr;
if (myStr) { // myStr != NULL
// ...
}
私は好むだろう
if (!myStr.empty())
{
//do something
}
また、std::string a = "";
と書く必要もありません。単にstd::string a;
と書くことができます-デフォルトでは空になります
デフォルトのコンストラクタは、文字列を空の文字列に初期化します。これは同じことを言うより経済的な方法です。
ただし、NULL
との比較は悪臭を放ちます。それは、まだ一般的に使用されている古い構文であり、他の何かを意味します。 nullポインター。周りに文字列がないことを意味します。
文字列(存在する)が空かどうかを確認する場合は、代わりにempty
メソッドを使用します。
if (myStr.empty()) ...