0

私がクラスを持っているとしましょう:

class String
{
public:
     String(char *str);
};

そして2つの機能:

void DoSomethingByVal(String Str);
void DoSomethingByRef(String &Str);

このようにDoSomethingByValを呼び出すと、次のようになります。

DoSomethingByVal("My string");

コンパイラーは、一時的なStringオブジェクトを作成し、char*コンストラクターを呼び出す必要があると判断します。

ただし、同じ方法でDoSomethingByRefを使用しようとすると、「パラメーターを「char *」から「String&」に変換できません」というエラーが発生します。

代わりに、インスタンスを明示的に作成する必要があります。

DoSomethingByRef(String("My string"));

これは、厄介な迷惑になる可能性があります。

これを回避する方法はありますか?

4

4 に答える 4

9

const参照を渡す必要があります:

にとって:

void DoSomethingByVal(String Str);

この状況では、コンパイラーは最初に一時変数を作成します。次に、一時変数がパラメータにコピー構築されます。

にとって:

void DoSomethingByRef(String const& Str);

この状況では、コンパイラーは一時変数を作成します。ただし、一時変数は参照にバインドできません。一時変数はconst参照にのみバインドできるため、元の関数を呼び出すことはできません。std :: stringオブジェクトコンストラクターはconst参照を取得することに注意してください。これは、コピーコンストラクターのパラメーターであり、一時がコピーコンストラクターのconst参照パラメーターにのみバインドされるため、最初のバージョンが機能する理由です。

于 2009-06-17T16:52:13.623 に答える
2

うーん、わからない

void DoSomethingByRef(String &Str);
DoSomethingByRef(String("My string"));

実際にコンパイルします。右辺値は、非 const への参照にバインドできません (非 const への参照は、値を変更することを示しており、一時的なものを変更する意味がないためです)。あなたがやっていないことは確かですか:

String str("My string");
DoSomethingByRef(str);

DoSomethingByVal で右辺値を取得する場合、パラメーターは const への参照である必要があります。

void DoSomethingByRef(const String &Str);
于 2009-06-17T16:52:32.937 に答える
0

作る:

DoSomethingByRef(const String &str);

于 2009-06-17T16:52:47.943 に答える
0

「私の文字列」は文字列ではなく、C 文字列、つまり char* です。その c-string を String オブジェクトに入れる必要があります。その後、新しい String オブジェクトを参照によって渡すことができます。

別のポイントとして、すでに char* を渡しています...これはかなり軽量で、単なるポインターです。新しいオブジェクトを参照渡しすることを心配する必要はありません。ヒープからそのコンストラクター内に新しいオブジェクトを割り当て、c-string をそれにコピーするだけです。

于 2009-06-17T16:55:30.500 に答える