2

私は通常、コードに std::string を使用しますが、単純な比較のためにパラメーターに文字列を渡す場合は、リテラルを使用する方がよいでしょうか?

この関数を考えてみましょう:

bool Message::hasTag(string tag)
{
    for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
    {
        if(m_tags[tagIndex] == tag)
            return 0;
    }

    return 1;
}

比較対象のプロパティはベクトルであり、この関数を使用するものはおそらく文字列を渡すという事実にもかかわらず、 const char* を使用して、次のように使用される新しい文字列を作成しないようにすることをお勧めします。とにかく文字列リテラル?

4

3 に答える 3

16

クラスを使用する場合、ここでの最善のアプローチは const 参照です。

bool Message::hasTag(const string& tag);

そうすれば、冗長なコピーを最小限に抑えることができ、メソッドが引数を変更する意図がないことが明確になります。これが文字列リテラルで呼び出された場合、賢いコンパイラはかなり良いコードを出力できると思います。

文字ポインターを渡すには、 を使用して比較する必要があります。これは、 を使用strcmp()して直接ポインターの比較を開始すると==、... 問題が発生するためです。

于 2010-07-05T16:14:45.670 に答える
2

簡単な答え: 場合によります。

長い答え:std::string文字列に対して多くのユーティリティ関数 (部分文字列の検索、部分文字列の抽出、文字列の連結など) を提供するため、非常に便利です。また、メモリも管理するため、文字列の所有権が混乱することはありません。

あなたの場合、どちらも必要ありません。m_tagsのオブジェクトのいずれかが指定された文字列と一致するかどうかを知る必要があるだけです。したがって、あなたの場合、 a を使用して関数を書くconst char *sだけで十分です。

ただし、脚注として: return valuesについて話すときは、ほとんどの場合、 よりも優先std::stringしたいと考えています。これは、C 文字列には所有権のセマンティクスがまったくないためです。そのため、 を返す関数は非常に注意深く文書化する必要があり、ポイントされたメモリ (呼び出し元または呼び出し先) の所有者と、呼び出し先がそれを取得した場合の解放方法を説明する必要があります ( 、、、何か他のもの)。(const) char *const char *delete[]deletefree

于 2010-07-05T16:26:26.543 に答える
1

の値ではなく参照を渡すだけで十分だと思いますstring。つまり:

bool Message::hasTag(const string& tag)

これは、元の値への参照のみをコピーしstringます。とにかくどこかに作成する必要がありますが、関数の外です。この関数は、そのパラメーターをまったくコピーしません。

m_tagsとにかく文字列のベクトルなので(私は思う)、const string&パラメータの方が良い考えです。

于 2010-07-05T16:25:49.677 に答える