web-dev-qa-db-ja.com

nullと空の文字列として文字列を初期化する

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
}

これに関するベストプラクティスや落とし穴はありますか?

37
Saket

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.
}
65
SingerOfTheFall

落とし穴はありません。 std::stringのデフォルトの構成は""です。ただし、文字列をNULLと比較することはできません。最も近い方法は、std::string::emptyメソッドを使用して、文字列が空かどうかを確認することです。

20
juanchopanza

ベスト:

 std::string subCondition;

これにより、空の文字列が作成されます。

この:

std::string myStr = "";

コピーの初期化を行います-""から一時的な文字列を作成し、コピーコンストラクターを使用してmyStrを作成します。

ボーナス:

std::string myStr("");

直接初期化を行い、string(const char*)コンストラクターを使用します。

文字列が空かどうかを確認するには、empty()を使用します。

14
Luchian Grigore

空性と「NULL性」は2つの異なる概念です。他の人が言及したように、前者はstd::string::empty()を介して達成でき、後者はboost::optional<std::string>を使用して達成できます。

boost::optional<string> myStr;
if (myStr) { // myStr != NULL
    // ...
}
6
Adam Romanek

私は好むだろう

if (!myStr.empty())
{
    //do something
}

また、std::string a = "";と書く必要もありません。単にstd::string a;と書くことができます-デフォルトでは空になります

3
Andrew

デフォルトのコンストラクタは、文字列を空の文字列に初期化します。これは同じことを言うより経済的な方法です。

ただし、NULLとの比較は悪臭を放ちます。それは、まだ一般的に使用されている古い構文であり、他の何かを意味します。 nullポインター。周りに文字列がないことを意味します。

文字列(存在する)が空かどうかを確認する場合は、代わりにemptyメソッドを使用します。

if (myStr.empty()) ...
1
Jirka Hanika