C++のclassとstructの違い

はっきりとした言及があまりなかったので一応メモ。

Cにおいてclassとstructは(Cには記憶クラスというものがあって)全くの別物だが、C++ではstructとclassに機能的な違いはない。

structとclassの違い

振る舞いとしての唯一の違いはデフォルトのアクセス指定子の違いである。

  • struct
    • デフォルトでpublic
  • class
    • デフォルトでprivate
struct hoge{
    int h;
};
class hage {
    int h;
};

int main() {
    hoge hoge_instance;
    hage hage_instance;
    
    hoge_instance.h = 1; //OK
    //hage_instance.h = 1; //NG 
    return 0;
}

次のように書けば等価

struct hoge{
public://かかなくても良いが
    int h;
};
class hage {
public:
    int h;
};

int main() {
    hoge hoge_instance;
    hage hage_instance;
    
    hoge_instance.h = 1; //OK
    hage_instance.h = 1; //OK
    return 0;
}

structとclassの使い分け

以下に使い分けに関して言及がある。

oop - What are the differences between struct and class in C++? - Stack Overflow

要点をまとめると

  • 機能的な違いはないからどちらを使ってもOK
  • 使い分けとして広く浸透しているものを明示的にのべるなら
    • structは機能が少ないものやカプセル化が殆どされてない(publicなメンバ変数、関数のみ)な場合に使用される
    • classは良く設計されたインターフェースを持ち、カプセル化がされており、洗練された機能を提供する場合に使用される
  • 具体的には、数個のメソッドとpublicな変数をもつ場合はstruct
  • 上記のようなカプセル化がされて(して)ないクラスは、十分に良く設計されたシステムにおいても存在しうる。