ページ 11

ドット演算子とアロー演算子

Posted: 2017年8月10日(木) 01:42
by マダガスカル
件名の通り、ドット演算子とアロー演算子の使い分け方がわかりません。

アローはnewしてdeleteすることで解放できるというくらいの違いは分かるのですが、それくらいしかわかりません。(まさかそれしか違いがない…?)

調べてもそれぞれの使い方ばかり出てきてそれ以上のことがわからない状態です。

Re: ドット演算子とアロー演算子

Posted: 2017年8月10日(木) 01:58
by みけCAT
C言語やC++の話で、オーバーロードはされていないと仮定すると、
ドット演算子は構造体やクラスに対してhoge.fugaのように使い、メンバにアクセスします。
アロー演算子は構造体やクラスを指すポインタに対してphoge->fugaのように使い、メンバにアクセスします。
phoge->fugaと(*phoge).fugaは同じ意味です。

コード:

#include <stdio.h>

typedef struct {
	int fuga;
} hoge_t;

int main(void) {
	hoge_t hoge = {42};
	hoge_t* phoge = &hoge;

	printf("%d\n", hoge.fuga);
	printf("%d\n", phoge->fuga);
	printf("%d\n", (*phoge).fuga);

	return 0;
}

Re: ドット演算子とアロー演算子

Posted: 2017年8月10日(木) 05:28
by マダガスカル
ポインタを指した場合何か良いのでしょうか?

軽くなったりでしょうか?

また、この場合はアロー演算子で、この場合はどっと演算子でやると良い。などわかりやすい例えってあげられませんか><;

Re: ドット演算子とアロー演算子

Posted: 2017年8月10日(木) 09:49
by YuO
マダガスカル さんが書きました:また、この場合はアロー演算子で、この場合はどっと演算子でやると良い。などわかりやすい例えってあげられませんか><;
. と -> は直接置き換えられる物ではありません。

コード:

struct struct_t {
    int member;
};
という型があった場合に,
  • コード:

    struct struct_t obj;
    と宣言された変数objのメンバーmemberにアクセスしたい場合は . を使う。

    コード:

    int value = obj.member;
    obj.member = 10;
  • コード:

    struct struct_t * ptr;
    と宣言された変数ptrのメンバーmemberにアクセスしたい場合は -> を使う。

    コード:

    int value = ptr->member;
    ptr->member = 10;
間違えた場合,コンパイラがエラーを出してくれます。
オフトピック
C++における非常に特殊な例を除きます。
つまり,operator ->を定義していて,定義した型を->が返す(ポインタ)型の元となる型の両方に同じ名前のメンバーがある場合。

Re: ドット演算子とアロー演算子

Posted: 2017年8月10日(木) 12:23
by かずま
マダガスカル さんが書きました:ポインタを指した場合何か良いのでしょうか?
ポインタを指すのではありません。
ポインタが実体を指します。
「構造体へのポインタ」は「構造体の実体」を指します。

「構造体のメンバ」の参照方法に次の 2通りあるということです。
  • 「構造体の実体」.「構造体のメンバ」
  • 「構造体へのポインタ」->「構造体のメンバ」
ポインタを、関数の引数に使うことで、
一つの実体をコピーなしに参照でき、
メンバの変更もできて、値を返すことができます。

ポインタを使わずに、実体を関数の引数にすると、大量の
データコピーが発生し、関数内でコピーのメンバを変更しても
関数の呼出し元の実体のメンバにはそれが反映されません。

マダガスカル さんが書きました: アローはnewしてdeleteすることで解放できるというくらいの違いは分かるのですが、それくらいしかわかりません。(まさかそれしか違いがない…?)
「アロー」が解放できるのではありません。
new で実体を確保して、その実態へのポインタを取得し、
その実体へのポインタを delete することによって
実体が解放できるのです。

Re: ドット演算子とアロー演算子

Posted: 2017年8月11日(金) 03:29
by マダガスカル
以前に単純にドットとアローでの書き方だけを変えたときにコンパイルが通ったので質問させていただきました。

ですが、今試したところ教えてくださったとおりちゃんとエラーがでました。
以前のファイルは消してしまったようで、再現も原因の究明もできませんがそれは別のところでの問題だったのだと思います。

また同じところで疑問を持ったら今度はコードも併せて質問させていただきます。

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