0

次のコードを検討してください。

void consumeString(std::string str){
  /* some code */
}

void passStringObject(){
  std::string stringObject = "string literal";
  consumeString(stringObject);
}

void passStringLiteral(){
  consumeString("string literal");
}

ここで、次の 2 つのケースを考えてみましょう。

1) 関数passStringObject()が呼び出されます。

2) 関数passStringLiteral()が呼び出されます。

ケース1では、関数を呼び出すときconsumeStringpassStringObject変数stringObjectが関数に渡され、consumeString(値による呼び出しのため)文字列クラスのコピーコンストラクタが呼び出され、パラメータstrがコピーになると仮定しますstringObject関数に渡された変数consumeString

しかし、関数consumeStringが呼び出されたときにケース 2 では何が起こるでしょうか? 文字列クラスの(オーバーロードされた)代入演算子(バックグラウンドでリテラルを「隠し」変数に割り当てる可能性がありますか?)は、コピーコンストラクターを呼び出して「隠し」変数の値をパラメーターにコピーする前に暗黙的に呼び出されますstrか?

4

5 に答える 5

0

ケース1では、オブジェクトを作成しているのはあなたであり、関数が呼び出されると、文字列クラスのコピーコンストラクタが呼び出され、文字列がコピーされます.

2 番目のケースでは、パラメーター化されたコンストラクター (char *パラメーター付き) が呼び出され、文字列オブジェクトが構築されます。

ケース 2 では、デストラクタ文字列クラスがconsumeString返されるとすぐに呼び出されます。最初のケースでは、デストラクタは、consumeString関数内の一時変数に対して 1 回、変数内の変数に対して 1 回、2 回呼び出されpassStringObjectます。

于 2014-02-14T11:48:45.480 に答える