1

文字列をトリミングする簡単なコードがあります

std::string TrimEnd(const std::string& str, const std::string& chars)
{
    std::string trimmed = str;
    int index = 0;
    if((index = trimmed.find_last_not_of(chars)) < trimmed.length() - 1)
            trimmed.erase(index + 1);
    return trimmed;
}

引数には参照を使用し、関数の戻り値には値を使用します。代わりにポインタを使用する設定はありますか?私の場合、トリミングされた文字列のコピーが返されます。一部の関数では、const参照が返されます。

4

4 に答える 4

2

いいえ、一般的な意味ではありません。NULL形式のポインターを渡すことができる必要がある場合、またはパラメーターに対してポインター演算を実行する必要がある場合は、ポインターを渡します。それ以外の場合は、デフォルトで参照を渡します。

于 2012-11-16T17:46:24.987 に答える
2

C ++スタイルの場合、値で返します。参照/定数参照を渡します。(PODの値) 静的ストレージを参照しない限り、参照によって返されることはありません。または、メンバー変数へのアクセスを公開する場合はメンバー変数を参照します(通常はconst&が使用されます)。はい、値による戻りはさらに別のコピーを生成します。ただし、古いc ++標準では、コンパイラーがそれを最適化できます。また、新しいc ++ 11標準では、さらに優れた移動コンストラクターが可能です。

于 2012-11-16T17:48:57.370 に答える
1

trimmed新しい文字列を返す場合、参照を渡す理由はありません。また、スコープがTrimEndメソッドであるため、参照を返したくないことは確かです。

あなたがあなたのコードを最適化しようとしているのでない限り、私は価値を渡すでしょう。独自の文字列クラス(またはそのようなもの)を作成していて、パフォーマンスが最優先事項である場合は、すべてを参照して行います。

于 2012-11-16T17:49:42.700 に答える
0

ここでは、とにかく最初の引数のコピーを作成しているので、値で渡すこともできます。

std::string TrimEnd(std::string str, const std::string& chars)
{
    int index = 0;
    if((index = str.find_last_not_of(chars)) < str.length() - 1)
        str.erase(index + 1);
    return str;
}

一般に:

  • 参照によってオブジェクトタイプを渡しますconst

  • プリミティブ(たとえばint)を値で渡し、可変コピーが必要な場合はオブジェクトタイプを渡します。

  • ポインタがnullの可能性がある場合は、パラメータをポインタで渡します。

  • 値またはスマートポインタ(例unique_ptr)で返します。生のポインタの所有権は不明確です。

于 2012-11-16T17:52:43.910 に答える