合計 昨日 今日

c++ クラスの基礎(?)

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: 基礎無いマン
[URL]
Date: 2017年10月10日(火) 20:30
No: 1
(OFFLINE)

 c++ クラスの基礎(?)

クラスの基礎について教えていただきたいです。

具体的に聞きたいことは、*を付けるときと付けないときでの.と->の差について知りたいです。

もう一つあって、newが必要なときとそうで無いときの差も教えていただけたら幸いです。
参考書のコードを見るとするときとそうで無いときがあって、「何かをするにはnewが必要なときとがあるんだなぁ」くらいの理解度です。

ぬるぽ吐いたら付けたり、取り敢えずnewしておくなどで動く状態を維持することは出来るかもしれませんが、 綺麗なコード作りも意識したいと考えているので、最低限は理解しておきたいと考えています。

どうぞよろしくお願いします。

Name: Math
[URL]
Date: 2017年10月10日(火) 22:14
No: 2
(OFFLINE)

 Re: c++ クラスの基礎(?)

>*を付けるときと付けないときでの.と->の差について知りたいです。
*を付けるとき->で付けないとき.です。
>もう一つあって、newが必要なときとそうで無いときの差も教えていただけたら幸いです。
newを使って作成するのはC言語のmalloc等と同じで、意図的にdeleteするまでオブジェクトは存在し続けます。使わないと同一スコープ内でしかそのオブジェクトを使えません。
>ぬるぽ吐いたら付けたり、取り敢えずnewしておくなどで動く状態を維持することは出来るかもしれませんが、 綺麗なコード作りも意識したいと考えているので、最低限は理解しておきたいと考えています。
綺麗なコード作りは”動くプログラムを書きまくって”失敗をしまくった後に考えても遅くないと思います。プログラムのエキスパートは全ての失敗を経験した人ではないでしょうか。

Name: purin52002
[URL]
プログラマー(26,267 ポイント)
Date: 2017年10月10日(火) 23:22
No: 3
(OFFLINE)

 Re: c++ クラスの基礎(?)

こんにちは

.(ドット演算子)と->(アロー演算子)の差は基本的にはありません。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
public:
    A():a(0) {}
    int a;
};
 
A obj ;
A *obj_p =new A();
 
int val1 = obj.a;
int val2 = obj_p->a;
int val3 = (*obj_p).a;

上記のコードではval1~3の値は等しくなります。(多分なるはずです^^;)
クラスのメンバにアクセスするときは.(ドット演算子)、クラスのポインタのメンバにアクセスするときは->(アロー演算子)を使います。
*(アスタリスク演算子?)を使って無理やりドット演算子でアクセスすることもできますが
私は素直にアロー演算子を使うほうが好きです^^
(見やすいし、ポインタっていうことがわかるから)

newが必要な場面は継承クラスを扱うときでしょうかね。
基底クラスのポインタに継承クラスのポインタを入れたり、、、
他の場面ではあまりnewは使わないですね(個人的な意見です^^;)
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Name: みけCAT
[URL]
伝説なるハッカー(677,371 ポイント)
Date: 2017年10月10日(火) 23:54
No: 4
(OFFLINE)

 Re: c++ クラスの基礎(?)

purin52002 さんが書きました:上記のコードではval1~3の値は等しくなります。(多分なるはずです^^;)

確かにクラスAのメンバaはデフォルトコンストラクタで同じ値に初期化されるのでそれをそのまま代入した変数は等しくはなりますが、
obj_pに代入したnew A()で作成したオブジェクトはobjではないので、objへの変更はobj_pが指すオブジェクトには反映されないし、
obj_pが指すオブジェクトへの変更はobjには反映されません。
obj_p->aと(*obj_p).aは(この場合オーバーロードされていないので)同じ意味になるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: 基礎無いマン
[URL]
Date: 2017年10月11日(水) 00:12
No: 5
(OFFLINE)

 Re: c++ クラスの基礎(?)

[解決!]

C言語のことはわかりませんが、newは同スコープ外で使いたいときに使用すればいいのだということがわかりました。

'.'と'->'の違いはほとんどないということで、私もなんとなくポインタのイメージが強い'->'を使おうと思います。

みなさまありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[18人]