クラスの基本/constオブジェクトとconstメンバ関数 (C++をもう一度)
[履歴] (2014/12/07 01:49:53)

サンプルコード

#include <iostream>
using namespace std;

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

public:
    int Get();
    int Get() const; // オーバーロード可能

private:
    int m_intval;
    mutable int m_intval_mutable; // 危険。使用には最新の注意を払いましょう
};

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

MyClass::MyClass(const MyClass& other) {
    m_intval = other.m_intval;
}

int MyClass::Get(){ // 非constメンバ関数
    cout << "NOT const member function" << endl;
    return m_intval;
}

int MyClass::Get() const { // constメンバ関数
    cout << "const member function" << endl;
    // constメンバ関数内でメンバ変数の値を変更したり
    // 非constメンバ関数を実行するとエラーになる。
    // ただし mutable なメンバ変数は変更可能
    m_intval_mutable = 0;
    return m_intval;
}

void ShowCopied(MyClass obj) {
    cout << obj.Get() << endl; // 非constオブジェクト
}

void ShowReferenced(const MyClass& obj) {
    // 非constメンバ関数内でメンバ変数が変更されない保証がない
    // ため、constオブジェクトはconstメンバ関数しか実行できない。
    cout << obj.Get() << endl; // constオブジェクト
}

int main() {
    MyClass obj(0);
    ShowCopied(obj);
    ShowReferenced(obj);
    return 0;
}
関連ページ
    概要 C++ を Python から利用する方法の一つに pybind11 があります。C++11 をサポートするコンパイラが必要です。サンプルコードを記載します。 pybind11 — Seamless operability between C++11 and Python Reference 簡単なサンプル