web-dev-qa-db-ja.com

C ++構造体にメンバー関数を含めることはできますか?

Structとclassの違いについてはかなり混乱していました。ほとんど同じものに使用されているように見えたからです。私は違いをグーグルで調べましたが、唯一の答えは、構造体にはデフォルトでパブリックメンバーがあり、クラスにはデフォルトでプライベートメンバーがあるということです。ただし、私の講師は、構造体にメンバー関数を含めることはできないと教えてくれました。しかし、人々が構造体にメンバー関数を含むインターネット上で多くのスレッドを見てきましたが、特にそうすることは大丈夫だと言います。

私の講師は、定義により構造体に機能を持たせることはできないと固く思っていますが、何が起こっているのでしょうか?私が考えることができる唯一のことは、おそらくコンパイラが構造体内の関数を他の何かに変更し、技術的に関数を含まないことです...これらの矛盾に対する明確な答えはありますか?

38
Sam

私は違いをグーグルで調べましたが、唯一の答えは、構造体にはデフォルトでパブリックメンバーがあり、クラスにはデフォルトでプライベートメンバーがあるということです。

はい、これは正しいです。さらに、構造体のベースはデフォルトでパブリックに継承されますが、クラスのベースはデフォルトでプライベートに継承されます。

構造体のメンバーとして関数を宣言することは、クラスのメンバーとして関数を宣言することとまったく同じセマンティクスを持ちますが、注意した違いは異なります。それぞれの場合で、それらはメンバー関数と呼ばれます。

39
Brian

実際、CではなくC++について話していると仮定すると、講師は明らかに間違っています。

コードでこれを自分で証明するか、 C++プログラミング言語 を見つけて構造体を調べるのは簡単です。

6
meagar

C++ structs can 間違いなくメンバー関数を持つ 。一方、C構造体は非常に異なる獣です。本質的には、特定のインデックスに名前と型の情報を提供する配列です。

3
Patrick Collins

C++ 98標準では:

構造体は、クラスキー構造体で定義されたクラスです。そのメンバーと基本クラス(10節)はデフォルトでパブリックです(11節)。

そして

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

つまり、structclassの唯一の違いは、publicまたはprivateであるデフォルトのメンバーアクセス制御です。

C++構造体にメンバー関数を含めることはできますか?

はい、できます。

私の講師は、定義により構造体に機能を持たせることはできないと固く思っていますが、何が起こっているのでしょうか?

Cの講義であれば、正しいです。 C++に関する講義である場合、それは正しくありません。

私が考えることができる唯一のことは、おそらくコンパイラが構造体内の関数を他の何かに変更し、技術的に関数を含まないことです...これらの矛盾に対する明確な答えはありますか?

はい、明確な答えがあります:C++構造体はメンバー関数を持つことができます。

1
YuGiOhJCJ

言語によって何かが許可されているからといって、それが良いアイデアであるとは限らないように思えます。技術的にはC++構造体には関数を含めることができますが、構造体データ型の本来の目的は関数を含めることではないと思います。クラス型を導入する主な目的は、データと、緊密な関係でデータに作用するロジックを定義することをサポートすることではなく、データへのより健全なインターフェースを促進することでしたか?

1
Travis