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

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

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

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

クラスの基本/コピーコンストラクタ (C++をもう一度)

モーダルを閉じる

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

モーダルを閉じる

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

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

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

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

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

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

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

目次

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

    0
    ステッカーを贈るとは?

    サンプルコード

    メンバ変数に配列が含まれている場合、関数等にオブジェクトを値渡しするためにはコピーコンストラクタを用意する必要があります。用意せずに値渡しすると、配列の先頭アドレスの値だけがコピーされ複数のオブジェクトで共有されることになり、片方のオブジェクトが破棄される際のデストラクタ処理などでアドレスが参照する先の領域が解放されてしまう恐れがあるためです。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    class MyClass {
    public:
        MyClass(int size);
        ~MyClass();
        MyClass(const MyClass& other); // コピーコンストラクタ
    
    public:
        int Get(int i);
    
    private:
        int m_size;
        int* m_intarr;
    };
    
    MyClass::MyClass(int size) {
        m_size = size;
        m_intarr = new int[size];
        fill_n(m_intarr, size, 0);
    }
    
    MyClass::~MyClass() {
        delete[] m_intarr;
    }
    
    MyClass::MyClass(const MyClass& other) {
        m_intarr = new int[other.m_size];
        m_size = other.m_size;
    
        // "algorithm" を include すると使用できる
        // (環境によっては他のヘッダファイルでもよい)
        copy(other.m_intarr, other.m_intarr + m_size, m_intarr);
        // ↑第一引数アドレス以降から第二引数アドレス未満にある値を、第三引数のアドレス以降にコピー
    }
    
    int MyClass::Get(int i) {
        return m_intarr[i];
    }
    
    void Show(MyClass obj) {
        // コピーされたので値を変更しても安心
        cout << obj.Get(0) << endl;
    }
    
    int main() {
        MyClass obj(2);
    
        Show(obj); // 値渡しが実現できる
    
        MyClass obj2(obj); // 応用。コピーコンストラクタによる変数初期化
        cout << obj2.Get(0) << endl;
    
        MyClass obj3 = obj; // このように記述してもよい
        cout << obj3.Get(0) << endl;
        return 0;
    }
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

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

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

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

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

    Feedbacks

    Feedbacks コンセプト画像

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

      関連記事