オブジェクトポインタについて

[戻る]
あかめ [E-Mail] 2003/10/14(火) 16:45:04
C++の学習をしているのですが疑問点が発生しました。
ご存知の方どうぞご教授くださいませ。
内容はPG1ではアロー演算子で参照するのにPG2ではどうしてドット演算子で参照するのか
ということが分らないです。
どうぞよろしくお願いします。

PG1:
class samp{
    int i, j;
public:
    void set_ij(int a, int b)    { i = a; j = b; }
    int get_product()    { return i * j; }};
int main(){
    samp *p;
    p = new samp;    // オブジェクトを割り当てる
    if(!p) {
        cout << "メモリ割り当てエラー\n";
        return 1;    }
    p->set_ij(4, 5);   // ここの個所
    cout << "積は:" << p->get_product() << "\n";  // ここの個所
    return 0;
}

PG2:
class samp {
    int i, j;
public:
    void set_ij(int a, int b)    { i = a; j = b; }
    int get_product()    { return i * j; }
};
int main() {
    samp *p;
    int i;
    p = new samp [10];    // オブジェクト配列を割り当てる
    if(!p) {
             cout << "メモリ割り当てエラー\n";
        return 1;    }
    for(i = 0; i < 10; i++)        p[i].set_ij(i, i); //ここの個所
    for(i = 0; i < 10; i++) {
        cout << "積 [" << i << "] は:";
        cout << p[i].get_product() << "\n";} // ここの個所
    delete [] p;
    return 0;

επιστημη [E-Mail] [HomePage] 2003/10/14(火) 17:14:21
p[i] はポインタではなく、ポインタが示す要素 *(p+i) だからです。

あえてアロー演算子で参照するなら:
(p+i)->get_product()
あるいは
(&p[i])->get_product()

2003/10/14(火) 17:29:24
επιστημηさんが既に回答してますが、表現をかえたらこんな感じでしょうか。

class Csamp
{
public:
    int a ;
};

int main()
{
   Csamp  samp ;
   Csamp* pSamp = &samp ;

   // 下記は結局同じ変数の表示を行っている
   printf( "オブジェクトの実体を用いてメンバ変数を指定 %d", samp.a ) ;
   printf( "オブジェクトのポインタを用いてメンバ変数を指定 %d", pSamp->a ) ;
}

あかめ [E-Mail] 2003/10/15(水) 11:24:30
επιστημηさん、んさんご返答どうもありがとうございます。

PG1の p = new samp; がオブジェクトポインタになって
PG2の p = new samp [10]; がオブジェクトになるのは
どうして

あかめ [E-Mail] 2003/10/15(水) 11:26:40
επιστημηさん、んさんご返答どうもありがとうございます。

上記の文途中で書き込みを行ってしまし申し訳ありません。
PG1の p = new samp; がオブジェクトポインタになって
PG2の p = new samp [10]; がオブジェクトになるのは
どうしてなのでしょうか?

επιστημη [E-Mail] [HomePage] 2003/10/15(水) 11:32:58
> PG1の p = new samp; がオブジェクトポインタになって
> PG2の p = new samp [10]; がオブジェクトになるのは

違います。どちらもポインタです。

char* str に対し str[i] の型は(*が取れて) char となります。それと同じ。 

# p[i] は *(p+i) の簡略形と思えばいいでしょう。

あかめ [E-Mail] 2003/10/15(水) 13:03:12
[[解決]]
επιστημηさんありがとうございます。

これは決まり事として覚えないといけないですね。

επιστημη [E-Mail] [HomePage] 2003/10/15(水) 13:47:12
> これは決まり事として覚えないといけないですね。

'カッコつけたら星が取れる' と、そんだけ覚えれば十分。

古いスレッドには追加発言できません。