1
void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

int main(void) {
    outputString("constant tranformed to reference argument");
    //! outputString(new string("abc")); new only return pointer to object
    return 0;
}

メソッドに変換する一時オブジェクト参照を作成することは禁止されているため、この構文は役に立たないはずですが、さらに混乱を招く可能性があります。では、なぜC ++はこの種の構文をサポートする必要があるのでしょうか?

編集:正直なところ、私はあなたの表現を理解していませんでした。上記の例を考えると、通常はvoid outputString(const string ss)代わりに使用します。通常は、定数/変数を処理する「値渡し」メソッドと「参照渡し」メソッドだと思います。void outputString(const string &ss)メソッドは変数のみを処理します。定数const type-id &の代わりに使用する必要がある唯一の理由const type-idは効率です。「参照渡し」メソッドはプリミティブ定数/オブジェクト変数のポインター(アドレス)のみを取得しますが、「値渡し」メソッドはコピー。

ありがとう。

4

4 に答える 4

3

constパラメーターの一時参照のみを作成できます。パラメータがconst参照でない場合は、参照がデータの一時コピーへの参照であることに気付かずにメソッド内のデータを変更する可能性があるため、禁止されています。

ただし、const参照の場合、データを変更することはできないため、コピーへの参照であり、安全であるかどうかは関係ありません。したがって、例が示すように、データが役立つので許可されます。

于 2009-12-24T10:09:42.383 に答える
2

あなたの選択肢は何ですか?

void outputString(const string ss);

これにより、タイプが完全に一致する場合でも、渡された文字列のコピーが作成されます。実際には必要ないオーバーヘッドです。

void outputString(string &ss);

これにより、渡された引数を変更できます。私たちはそれをしたくありません、そしてC ++は私たちが一時的なものを変更することから私たちを保護するために、もはや一時的なものを渡すことを許可しません(これらの変更はとにかく次の瞬間に失われます)。

つまり、2つの側面に適合します。つまり、非一時的な文字列をコピーせずに渡すことができ、一時的な文字列を渡すことができます。そして、それは私たちが議論を変えようとするのを防ぎます。良い妥協のようです。

于 2009-12-29T19:18:24.967 に答える
2

どこを変更しssますか?

cout << "outputString(const string& ) " + ss << endl;

この行は、オブジェクトを変更せずに、内部で一時的なものを作成します。const&ss

コンパイラは通常、次のことを行います。

string tmp = "outputString(const string& ) " + ss;
cout << tmp << endl;
于 2009-12-24T10:08:35.253 に答える
0

つまり、リテラルをconstオブジェクト参照に変換できます。

これは重要。そうしないと、OutputString(std :: string( "literal"))を記述する必要があり、非常に煩わしくなります。std::stringとchar*を受け入れるメソッドに対して別々のオーバーロードを作成していることに気付くでしょう。

于 2009-12-24T10:11:20.217 に答える