
仕事ではC言語を使っています。7年ぶりくらいにC++を勉強しなおす気になりました。勉強し始めて疑問に思ったことがあります。
C++では構造体もメンバ関数やコンストラクタ、デストラクタをもてるようですが、なぜそのような仕様になったのでしょうか?クラスでできることをわざわざ構造体(や共用体)でも出来る必要性を感じません。(きらいなら使わなければいいだけのことですが。)
学生時代にC++を勉強したとき使っていた本(※)にそのような記述が無かったような気がします。
※柴田望洋著:プログラミング講義C++、ソフトバンクブックス、1997
なぜそのような仕様になっているのか、経緯や必要性について教えてください。
No.3ベストアンサー
- 回答日時:
質問者さんがお望みのこと全てではありませんが、D&E (C++の設計と進化)という本の
94~95ページに、なぜclass と structという二つのキーワードが
ほぼ同じ機能を持っているのかということについての説明があります。
詳しくは買うなり図書館に行くなりして実際に読んでもらうとして、
簡単にまとめると、structをCでの機能をのままにすることによって
C++文脈でのclass、C文脈でのstructというように概念的に二つに分かれて
しまうのを嫌がったということのようです。
この本には、「なぜC++は××に関してこのような仕様になっているのか?」
についての回答が得られる貴重な本です。
余裕があれば読んでみると良いでしょう(分厚いけどね)。
C++の設計と進化 (単行本)
ビョーン ストラウストラップ (著), Bjarne Stroustrup (原著), 岩谷 宏 (翻訳), エピステーメ (著)
http://amazon.jp/dp/4797328541
回答ありがとうございます。
ご紹介いただいた本、魅力的なのですが分厚いのはやや難ですね。購入するにしても今参考にしている「独習C++」(やっぱり分厚い)をやっつけてからになりそうです。

No.5
- 回答日時:
クラスと構造体の(実装ではなく)理念上の違いはご理解されているということで良いかと思います。
その上で、「構造体」とは、あくまでもまとまったデータセットです。
このデータセットを「安全に」初期化するためには、コンストラクタというのは、十分に実用的です。
特に、構造体の初期化データを外部から持ってきたり、外部に(暗黙のうちに)保存したりという操作を行うためには、コンストラクタやデストラクタは必須の機能になります。
また、データ特有の操作についても、メンバ関数は有用です。
「クラスでできることをわざわざ構造体でもできるようにした」のは、本来の意味からすれば、クラスと構造体は、別の用途であるので、それぞれの用途に於いて、「統一的に」初期化や後始末や、そのほかの処理が行えるようにしたというところです。
参考URL:http://www.cmagazine.jp/src/kinjite/cpp/idea.htm …
回答ありがとうございます。
> このデータセットを「安全に」初期化するためには、コンストラクタというのは、十分に実用的です。
これは大いに頷けます。
No.4
- 回答日時:
No.1 の方の回答のとおり、互換性のためだと思います。
既存のCのソースコードに「一切手を入れずに」、修正したり拡張したりする、ということがC++言語仕様策定の重要な要件(作者の)だったと思います。
C++作者の「プログラミング言語C++」(今は第3版?)等を読むと、作者の思いなども書かれていて、とても面白いですよ。
私の独断ではありますが、今では単なる syntax sugar に過ぎなくなっているので、struct の構文は要らないです。
私自身は、すべて class で記述しているので。
ただ、既存の(昔作られた)ライブラリなどをコンパイルするためにはいきなり無くなってしまうと困る、皆様そんなかんじではないでしょうか。
MFCなどを考えて見ると、CPoint等、簡単なものについてはわざわざstructにしてますが、最初うっかりやってしまった後の互換性のため、やむを得ず、ということだと思います。
本質的には全くどうでも良いと思ってます。
> それなら、structに手を加えずそのままにして置けばよかったのに、
> と思うのは私がCばかり使ってきたからでしょうか。
確かに、struct にはメンバ関数は定義できないようにしたうえで、C++としての拡張をしても良かったのかも知れませんね。
ただ。
初期C++言語はCのプリプロセッサとして実装されていたそうで、たぶんコンパイラの実装のことまで考えて妥協した部分もあるのでは?
コンパイラの作成は難しいですし。
> 学生時代にC++を勉強したとき使っていた本(※)にそのような記述が無かったような気がします。
> ※柴田望洋著:プログラミング講義C++、ソフトバンクブックス、1997
私も実はそれを読みました(^^;
今は捨ててしまったので確認できませんが、struct と class の関係については、最初から変わっていないと思います。
ので、その本でもウソは書かれていなかったと思うのですが、とにかく、帯に書かれていた宣伝文句とは裏腹に、分りにくい本だったという記憶があります。
回答ありがとうございます。
互換性、の一言に尽きそうですね。
互換性を考えなくて済むJavaでは構造体がなくなっているところを見ると、クラスがあれば構造体が無くても済んでしまうということなのでしょう。
(なのに、C#ではまた構造体が登場して訳が分かりません。)
>> ※柴田望洋著:プログラミング講義C++、ソフトバンクブックス、1997
> 今は捨ててしまったので確認できませんが、struct と class の関係については、最初から変わっていないと思います。
本を引っ張り出してきて確認してみたところ、
Column 12-4 クラスと構造体と共用体 に、「(3)メンバ関数を持つことが出来ない」とはっきり書かれていました。
しかし、この本が発行されたのは1996年12月と古いため、ANSI/ISOで標準化されるうちに新しい機能として追加されたのではないかと思っています。
No.2
- 回答日時:
C++では、構造体や共用体もクラスの一種です。
クラスなのだから、メンバ関数を持てるのは当然です。C++のクラスの宣言は、
クラスキー タグ名
という形式で行いますが、このクラスキーに指定できるのは、class, struct, unionの3種類があります。classとstructの違いは、アクセス指定がデフォルトでprivateになるかpublicになるかだけです。unionはメンバ変数のメモリ配置が違ったり、他のクラスから派生したり、派生されたりしない点が大きく異なります。
> クラスでできることをわざわざ構造体(や共用体)でも出来る必要性を感じません。
そういう観点からすれば、structでできるのにわざわざclassを導入する必要はなかったともいえます。
早速の回答ありがとうございます。
> C++では、構造体や共用体もクラスの一種です。
クラスが先にあるのでか。そうなると、CとC++では名前はおなじ struct でも概念は別物(だけどCと同じ使い方はできるようにしてある)と理解しておいたほうがよさそうですね。
No.1
- 回答日時:
c互換のためっていうのが一番大きいと思います
structを捨てることはできなかったんでしょう
私はclassと構造体は使い分けてますけどね
(私は、というより今のプロジェクトがそうなっているからともいえる)
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2007539
回答ありがとうございます。
> structを捨てることはできなかったんでしょう
それなら、structに手を加えずそのままにして置けばよかったのに、と思うのは私がCばかり使ってきたからでしょうか。
> 私はclassと構造体は使い分けてますけどね
私は
クラス = データと振る舞いをセットにしたもの
構造体 = (関連の深い)データのまとまり
と理解していたので、構造体が振る舞いをもったり、継承されたりするとすごく気持ち悪いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri- 3 2023/07/06 18:59
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- IT・エンジニアリング バックエンドエンジニアに転職 2 2022/04/07 00:51
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- モニター・ディスプレイ フルHD6枚表示できるPCの最適構成は何でしょうか? 4 2022/11/18 19:07
- 大学受験 高二文系です。受験についてです。 英数の偏差値は57.5くらいで国理社50切るくらいです。浪人不可能 2 2023/02/20 22:50
- 数学 C言語と将来性 7 2022/10/13 16:49
- 化学 構造式とは(ジエチルエーテル) 3 2022/11/24 11:11
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
プログラマー達は何故、プログ...
-
C#でTreeViewのCheckBoxのサイ...
-
visual studio 2022でのC#プロ...
-
略語の読み方について
-
c言語
-
C言語の関数のextern宣言
-
【C言語】全角文字の配列を、全...
-
最初に聞かれたこと
-
C言語 関数、変数の宣言について
-
あってる
-
C言語のことです。写真(見にく...
-
プログラミング言語についてc++...
-
UART通信の取説で,left floati...
-
パソコン
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C++でデスクトップGUIアプリ開...
-
C言語について。
-
C言語 解答について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報