1

const参照としてオブジェクトを別のオブジェクトに渡すと、コピーが作成されますか?参照によってオブジェクトを渡したので、メンバーオブジェクト自体は実際にはコピーではなく、渡したオブジェクトであると常に想定していました。渡された参照オブジェクトをスコープの最後で破棄するテストプログラムを作成しましたが、期待どおりにクラッシュしません。これは発生するのを待っているバグですか、それともオブジェクトがコピーされていますか?

#include <iostream>
#include <string>

class Something
{
public:
    Something(const std::string& str) : mStr(str) {}
    const std::string& str() const
    {
        return mStr;
    }
private:
    std::string mStr;
};

int main()
{
    Something* something;
    {
        std::string temp = "Testing.";
        something = new Something(temp);
    }

    std::cout<<something->str()<<"\n";
    delete something;
    return 0;
}

そのstd::stringはまだ有効ですか、それとも削除されていますか?(オブジェクト自体で)

4

3 に答える 3

6

データ メンバーmStrは型ですstd::string(参照ではなくオブジェクトです)。

したがって、コンストラクターの初期化リストで ( 経由で: mStr(str)) 初期化すると、参照によって渡された引数がコピーされます。あなたの例では、初期化のみがコピーを作成します。初期化を削除すると、コピーは作成されません。

于 2012-07-07T19:04:49.183 に答える
3

variableの内容tempが にコピーされmStrます。コードは有効です。

于 2012-07-07T19:04:36.920 に答える
3

mStr(str) が str のコピーを作成するという事実を見落としていることを除いて、あなたは正しいです。このコピーは ~Somthing(); で破棄されます。

于 2012-07-07T19:04:59.093 に答える