ここから本文です

[c++] オブジェクト指向を独学で習い始めた者です。 クラスを宣言してメンバにpri...

れてさん

2020/3/2813:40:22

[c++] オブジェクト指向を独学で習い始めた者です。
クラスを宣言してメンバにprivateやpublicを加え、区別する事がよくあります。

privateにするとオブジェクト以外の外部からアクセスが出来ない、publicはその逆なのはわかるのですがイマイチこれがどれくらい効果を発揮するのかよくわかりません。本を読むと大事なデータ(stackの容量など)を改竄させない為にprivateをつけると書かれてますがそれでもオブジェクト.メンバ変数or関数でprivateでもアクセスできるし勝手に改竄できるのでは?と思ってます。
冒頭でも書いた通りこのプログラミング手法は全くの初心者で概念もイマイチ分かっておりません。どなたかわかりやすくprivate/publicの設定を疎かにするとどれほど作品に影響を及ぼすのかを教えていただけませんか?

閲覧数:
58
回答数:
10
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

leh********さん

2020/3/2822:49:00

> private/publicの設定を疎かにするとどれほど作品に影響を及ぼすのか
深刻な影響はないでしょうね。
今人気が上昇している Python 言語は public しかありません。
メンバー名そのもので外部からアクセスできなくする方法はありますが、どのメンバーにも外部から直接アクセスが可能です。
(private で使いたいと表現できるだけで private にできないのが Python)
public しかない Python で YouTube、Instagram、Dropbox といったWebサービスが開発されています。

> このプログラミング手法は全くの初心者で概念もイマイチ分かっておりません。
private/public の概念は次のように考えると分かりやすいかもしれません。
クラスから生成したインスタンスが「あなた自身」と考えて、インスタンスのメンバーは例えば「あなたのお財布」と考えます。
public の設定をするということは、他の人が自由にあなたのお財布を直接使うことを許容していることになります。
public にしたためあなた自身が管理できず気が付いたらだいぶ少なくなっているかもしれませんし増えているかもしれません。
もしかすると現金が請求書に変わっているかもしれませんね。
private の設定をするとあなたのお財布を使うには「あなたの手」(インスタンスメソッド)でしか使えなくなることを意味します。
必ずあなたの手を使いますからいついくら入れたかいくら出したか記録したくなったらいつでも簡単に記録機能を追加できます。
public にしたからといって思わぬことは滅多に起こりませんから、起こったら private にして直接お財布を使っているところを全部直すというアプローチもあります。
直接お財布を使っているところが100箇所とかあると結構時間がかかりますが気にしない人だったら問題ないでしょう。
ただ、複数の人とプログラムを行っていると他の人に変更させなくてはいけない状況になります。
説得力に自信があって迷惑を掛けると考えない人であれば問題ないでしょう。
でもこのアプローチを賢いと思わないのであれば private に設定するだけで回避できますね。

質問した人からのコメント

2020/3/29 22:34:27

他9名の方々の説明もかなり分かりやすかったのですが例えが最も感じれました。
完璧とは言えずともある程度は掴むことができました、ありがとうございました。

ベストアンサー以外の回答

1〜5件/9件中

並び替え:回答日時の
新しい順
|古い順

bas********さん

2020/3/2912:12:48

えーっとまず、最初にオブジェクト指向(以降 OOP) とはを説明します。

単に"クラスを組んだからOOPだ" ではないです。

OOPは「データと処理をひとまとめにしてオブジェクトに任せる発想法」です。

C言語ぐらいまでは データと処理(関数) は別物でしたが、これをデータと処理(関数) をひとまとめにした"オブジェクト"というやつに任せる手法です。

これによって「オブジェクトだけが対象データと処理方法を知っている」という状態にできます。

そして、メンバ変数をpublicにしてしまうと、「グローバル変数」と大差無くなります。

そのクラスやオブジェクトにアクセスできる範囲ならどこからでも書き換えができます。

なので、private にするのです。

get/setもあまり変わりませんが、getだけを許可するとか、setありでも「あり得ないデータ」ならはじくことも可能です。

例えば体重とか身長とかでマイナス値ってあり得ますか。
(ここでは「人物の大きさ」等を示すとして。"差" ではなく。)

ありえませんね。

「彼は -20cm です」なんて聞いたことがありません。
(もちろん、誰かと比較して…のものならあり得るが)

あとは 0g (ゼログラム) なんてのもありえませんね。
乳幼児ですら、もうちょいあるでしょ。
みたいな。

これを 「マイナス値や0なら無視」みたいに設定することもできます。(あるいは例外を飛ばしたり)

get/setはそういう風に「苦肉の策」として使っています。

基本的には「オブジェクトに任せる」のがベスト。

そして、privateとかpublicとかは「オブジェクトの外側から見たもの」です。

すべてpublicにしてしまうと、上記で述べたように、「グローバル変数」と大差ないので、もしpublicなメンバ変数が書き換わっているとしたら、調べる範囲は「すべてのコード」になってしまいます。
(もちろん、そのクラスやオブジェクトが見える範囲で)

ですが、メンバ変数はprivate ...とかっていう風に適切にやれば、
「そのオブジェクトの指定のメンバ関数を動かしている範囲」や「そのメンバ変数を使っている自分のメンバ関数」内を調べるだけでいいのです。

つまり、修正範囲を抑えられる。
もしすべてpublicにするとすべての範囲が対象になるのでめんどくさい。

nee********さん

2020/3/2902:29:14

>イマイチこれがどれくらい効果を発揮するのかよくわかりません。

1. 小グループ特に個人ではまったく意味がない。

2.大規模グループ開発でも商用ソフトのようにきちんとドキュメントがあれば
意味があるかは不明。たぶん意味がない。

3.オープンソースのようにソースコードがドキュメントを兼ねる場合、
利用者が使用して良いか良くわからずに書き換える事は想定しうる。
従いこの場合は効果を期待できる。


このように整理すると「ソースコード≒仕様書」と捉えた時に、他人のクラスを使う時にはまあ効能はありそうですね。
個人的には他人の作ったクラスをこじった使い方を避けますから意味がないというより、コンパイラのバグ/仕様の相違を山ほど見ているとバグの温床にしか見えませんねえ・・・

PS.
オープンソースを利用しているとコンパイラのバージョンによりエラーが出たり出なかったりします。
というわけで私は否定的ですね。

2020/3/2820:23:28

オブジェクト指向機能をC言語に組み込み
C言語の自由度のある程度を継承したのが、C++。

Why オブジェクト指向を理解せんと
private/public の意味は分からんし、
理解も無く節操も無いプログラムは、破綻する!

オブジェクト指向プログラミングでは、
設計上の枠組みは極めて大事な要件さ。

yuk********さん

2020/3/2818:40:29

極めてプライベートな話なんだけどね。
キミは漫画を本棚に並べるとき、キミなりの法則を以てキミ好みの並べ方をするだろ? 出版社順か作者順かタイトル順かは知らんけど。
友達が遊びにきたとき、本棚から漫画を取り出して読むことは許しても、元の位置に戻さずテキトーな位置に戻されるのはイヤだろ? そんなことをされるくらいなら「オレが自分の手で戻すから読み終わった漫画はその辺に積んどけ」って言わないかい?

つまりね、「整合性を維持するため、勝手に弄られては困る部分」をprivate宣言(オレがやるからお前は触るな宣言)するわけ。

prwssさん

2020/3/2818:10:53

>private/publicの設定を疎かにするとどれほど作品に影響を及ぼすのか

試しに全てをpublicにして数千行の作品を書いてみると分かります

おそらく、数千行程度を個人で書くなら、全部publicでもダイジョブです

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる