14

今日は、C++ で構造体とクラスの違いを見つけたいと思っていました。だから、私はいくつかの違いを見つけました:

  1. 構造体では、デフォルトでメンバーはパブリックであり、クラスではプライベートです。
  2. 構造体の場合の継承はデフォルトでパブリックですが、クラスの場合はプライベートです。
  3. クラスはテンプレートに参加できますが、構造はできません。

ここをクリックして、テンプレートの場合、クラスの代わりに構造体を使用できないことを確認してください。http://ideone.com/p5G57

template<struct T> void fun(T i)
{
    cout<<i<<endl;
}

int main()
{
    int i=10;
    fun<int>(i);
    return 0;
}

エラーが表示されます:

prog.cpp:4: error: ‘struct T’ is not a valid type for a template constant parameter
prog.cpp: In function ‘void fun(T)’:
prog.cpp:4: error: ‘i’ has incomplete type
prog.cpp:4: error: forward declaration of ‘struct T’
prog.cpp: In function ‘int main()’:
prog.cpp:12: error: no matching function for call to ‘fun(int&)’

ただし、structをclassに置き換えると、完全に機能します。こちらをご覧ください: http://ideone.com/K8bFn

上記の違いとは別に、コードを に置き換えるclassstruct、コードはそれ以上変更しなくても完全に機能します。

今、知りたいのですが、私が見逃していて知っておくべき違いは他にありますか?

4

3 に答える 3

27

他に違いはありません、指定した 3 番目のものは正しくありません。

クラスはテンプレートに参加できますが、構造はできません。

テンプレートの場合、classキーワードは単なる構文糖衣であり、型が実際のクラスでなければならないという意味ではありません。一般に、プログラマーtypenameは基本型とclassクラスまたは構造体を好みますが、それは単なる慣例です。

それ以外に、 と の両方classを使用structしてテンプレートを特殊化できます。

于 2012-06-20T11:52:15.457 に答える
4

主な違いは 2 つあります。

  • base に access-specifier がないclass場合、派生クラスが宣言されたときに public が想定されstruct、クラスが class として宣言されたときに private が想定されます。

  • キーワード class で定義されたクラスのメンバーは、デフォルトでプライベートです。キーワードで定義されたクラスのメンバーstructまたはunionデフォルトで public です。

于 2012-06-20T11:56:08.423 に答える
1

構造体は、デフォルトですべてのメンバーが public である単なるクラスです。

The C++ Programming Language (3rd ed.) によると、セクション 10.2.8:

定義上、構造体はメンバーがデフォルトで public であるクラスです。あれは

struct s{ ...

は単に省略形です

class s { public: ...

それから彼は次のように続けます。

私は通常、すべてのデータが公開されているクラスに構造体を使用することを好みます。私はそのようなクラスを「適切な型ではなく、単なるデータ構造」と考えています。

コメントごとに編集

セクション15.3.2では、次のように述べています。

基本クラスのアクセス指定子は省略できます。その場合、ベースはデフォルトで、クラスのプライベート ベースとstructのパブリック ベースになります。

于 2012-06-20T12:10:25.767 に答える