C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++における構造体とクラスの違いとは?アクセス指定子の挙動を実例付きで解説

はじめに

C++において、構造体(struct)とクラス(class)は本質的にはほぼ同じものです。どちらもメンバ変数やメンバ関数を持つことができ、継承・カプセル化といったオブジェクト指向の機能も同様に利用できます。しかし、両者にはいくつかの細かな違いが存在します。この記事では、その違いをサンプルコードと実行結果を交えてわかりやすく解説します。

違い1:メンバのデフォルトのアクセスレベル

最も大きな違いは、メンバのデフォルトのアクセス権限です。クラスのメンバはデフォルトで「private(非公開)」になりますが、構造体のメンバはデフォルトで「public(公開)」になります。実際に、以下の2つのコードでその違いを見てみましょう。

クラスの場合(コンパイルエラーになる例)

#include <iostream>
using namespace std;
class my_class {
   int x = 10;
};
int main() {
   my_class my_ob;
   cout << my_ob.x;
}

出力

このプログラムはコンパイルできません。
メンバ x が private であるため、外部からアクセスすると
コンパイル時エラーが発生します。

このように、クラス内で宣言した x にはアクセス指定子を明示していないため、自動的に private 扱いとなり、外部から参照できません。

構造体の場合(正常に動作する例)

#include <iostream>
using namespace std;
struct my_struct{
   int x = 10;
};
int main() {
   my_struct my_ob;
   cout << my_ob.x;
}

出力

10

構造体の場合はメンバがデフォルトで public となるため、同じコードでも問題なく x の値が出力されます。

違い2:継承時のデフォルトアクセス指定子

もう一つの違いは、継承を行う際のデフォルトのアクセス指定子です。

  • 構造体からクラスや構造体を派生させる場合:基底クラスへのデフォルトのアクセス指定子はpublic
  • クラスから別のクラスを派生させる場合:デフォルトのアクセス指定子はprivate

つまり、クラスの継承時にアクセス指定子を省略すると、基底クラスの public メンバであっても、派生クラスの外部からアクセスできなくなる点に注意が必要です。

クラスの継承の場合(コンパイルエラーになる例)

#include <iostream>
using namespace std;
class my_base_class {
   public:
   int x = 10;
};
class my_derived_class : my_base_class{
};
int main() {
   my_derived_class d;
   cout << d.x;
}

出力

このプログラムはコンパイルできません。
基底クラスの変数 x にアクセスできないという
コンパイル時エラーが発生します。

継承の記述が : my_base_class となっており、アクセス指定子が省略されているため、デフォルトの private 継承として扱われます。その結果、基底クラスの public メンバである x も外部からアクセスできなくなります。

構造体の継承の場合(正常に動作する例)

#include <iostream>
using namespace std;
class my_base_class {
   public:
      int x = 10;
};
struct my_derived_struct : my_base_class{
};
int main() {
   my_derived_struct d;
   cout << d.x;
}

出力

10

構造体による継承では、デフォルトで public 継承となるため、基底クラスの x にそのままアクセスできます。

構造体とクラスの違いまとめ

項目classstruct
メンバのデフォルトアクセスprivatepublic
継承時のデフォルトアクセス指定子privatepublic
機能面(継承・コンストラクタ等)利用可能利用可能

まとめ

C++における構造体とクラスの機能的な差はごくわずかで、主な違いは「デフォルトのアクセス権限」にあります。単純にデータをまとめたい場合は public メンバを持つ構造体が便利であり、カプセル化を重視する場合はクラスを使用するのが一般的です。ただし、意図しないアクセス制御ミスを防ぐためにも、デフォルトの挙動に頼らず、アクセス指定子を明示的に記述する習慣をつけることをおすすめします。

  1. 【C++入門】多重継承の基本と実装方法をわかりやすく解説

    多重継承(Multiple Inheritance)とは多重継承とは、ひとつのクラスが複数の基底クラス(親クラス)から派生する仕組みのことです。多重継承を利用することで、派生クラスは複数の基底クラスが持つ機能やデータメンバをまとめて引き継ぐことができます。これはC++に代表されるオブジェクト指向プログラミング言語における重要な機能のひとつです。多重継承の構造を表した図が以下になります。C++で多重継承を実装するサンプルプログラムここでは、C++で多重継承を実装したサンプルプログラムを紹介します。クラスCが、クラスAとクラスBの2つのクラスを同時に継承する例です。サンプルコード#include

  2. C++プログラムの基本構造を徹底解説!Hello Worldで学ぶ入門

    C++プログラムの基本構造とは プログラミング言語を効率よく習得する最良の方法は、実際にプログラムを書いてみることです。初心者が最初に書くプログラムとして定番なのが、「Hello World」という文字列を画面に表示するだけのシンプルなプログラムです。ごく簡単な内容ですが、C++プログラムに必要な基本的な構成要素がすべて詰まっています。それでは、さっそくコードを見てみましょう。 #include<iostream> int main() {     std::cout << Hello World\n; } ここからは、このプログ