テンポラリオブジェクト (C++をもう一度)
[履歴] [最終更新] (2014/12/21 01:48:21)
最近の投稿
注目の記事

テンポラリオブジェクトの生成箇所

インスタンス生成時

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass(int intval);
    MyClass(const MyClass& other);
    void operator=(const MyClass& other);

public:
    void Show() const;

private:
    int m_intval;
};

MyClass::MyClass(int intval) :
    m_intval(intval)
{
    cout << "MyClass::MyClass" << endl;
}

MyClass::MyClass(const MyClass& other) {
    cout << "MyClass::MyClass(copy)" << endl;
    m_intval = other.m_intval;
}

void MyClass::operator=(const MyClass& other) {
    cout << "MyClass::MyClass(=)" << endl;
    m_intval = other.m_intval;
}

void MyClass::Show() const {
    cout << m_intval << endl;
}

int main() {
    // 形式 1
    MyClass obj(0); //=> MyClass::MyClass
    obj.Show(); //=> 0

    // 形式 2
    MyClass* ptr = new MyClass(1); //=> MyClass::MyClass
    ptr->Show(); //=> 1

    // 形式 3
    // (テンポラリオブジェクトを生成してコピーコンストラクタで「初期化」)
    MyClass objCopied = MyClass(2); //=> "MyClass::MyClass\nMyClass::MyClass(copy)"
                                    //   ↑一つ目はテンポラリオブジェクトの分
                                    // or "MyClass::MyClass"  ←コンパイラの最適化でコピーされない場合
    objCopied.Show(); //=> 2

    // 形式 4
    // (テンポラリオブジェクトを生成して「代入」)
    obj = MyClass(3); //=> "MyClass::MyClass\nMyClass::MyClass(=)"
    obj.Show(); //=> 3

    return 0;
}

関数からオブジェクトを返す際

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass(int intval);
    MyClass(const MyClass& other);

public:
    void Show() const;

private:
    int m_intval;
};

MyClass::MyClass(int intval) :
    m_intval(intval)
{
    cout << "MyClass::MyClass" << endl;
}

MyClass::MyClass(const MyClass& other) {
    cout << "MyClass::MyClass(copy)" << endl;
    m_intval = other.m_intval;
}

void MyClass::Show() const {
    cout << m_intval << endl;
}

MyClass MyFunc() {
    MyClass _obj(0); //=> "MyClass::MyClass"
    return _obj;
}

int main() {
    MyClass obj = MyFunc(); // テンポラリオブジェクトが生成されて、
                            // それをコピーコンストラクタの引数に使用
    obj.Show(); //=> 0
    return 0;
}

const参照でテンポラリオブジェクトを指す

テンポラリオブジェクトを指し示している参照が存在する限り、テンポラリオブジェクトは破壊されません。

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass(int intval);

public:
    void Show() const;

private:
    int m_intval;
};

MyClass::MyClass(int intval) :
    m_intval(intval)
{
}

void MyClass::Show() const {
    cout << m_intval << endl;
}

void MyFunc(const MyClass& obj) {
    obj.Show();
}

int main() {
    // const参照を引数とする関数に渡す
    MyFunc(MyClass(0)); //=> "0\nMyClass::~MyClass"

    // 直接的にconst参照に指させる
    const MyClass& ref = MyClass(1);
    ref.Show(); //=> "1"

    return 0;
} //=> "MyClass::~MyClass"
関連ページ
    基本的な代入演算子 #include <iostream> #include <algorithm> using namespace std; class MyClass { public: MyClass(int size); ~MyClass(); void operator=(const MyClass& other); // 演算子オーバーロード public: