モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

テンポラリオブジェクト (C++をもう一度)

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2014/12/21
最終更新最終更新
2017/04/28
記事区分記事区分
一般公開

目次

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

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

    インスタンス生成時

    #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"
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事