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;
p[i] はポインタではなく、ポインタが示す要素 *(p+i) だからです。
あえてアロー演算子で参照するなら:
(p+i)->get_product()
あるいは
(&p[i])->get_product()
επιστημηさんが既に回答してますが、表現をかえたらこんな感じでしょうか。
class Csamp
{
public:
int a ;
};
int main()
{
Csamp samp ;
Csamp* pSamp = &samp ;
// 下記は結局同じ変数の表示を行っている
printf( オブジェクトの実体を用いてメンバ変数を指定 %d, samp.a ) ;
printf( オブジェクトのポインタを用いてメンバ変数を指定 %d, pSamp->a ) ;
}
επιστημηさん、んさんご返答どうもありがとうございます。
PG1の p = new samp; がオブジェクトポインタになって
PG2の p = new samp [10]; がオブジェクトになるのは
どうして
επιστημηさん、んさんご返答どうもありがとうございます。
上記の文途中で書き込みを行ってしまし申し訳ありません。
PG1の p = new samp; がオブジェクトポインタになって
PG2の p = new samp [10]; がオブジェクトになるのは
どうしてなのでしょうか?
> PG1の p = new samp; がオブジェクトポインタになって
> PG2の p = new samp [10]; がオブジェクトになるのは
違います。どちらもポインタです。
char* str に対し str[i] の型は(*が取れて) char となります。それと同じ。
# p[i] は *(p+i) の簡略形と思えばいいでしょう。
επιστημηさんありがとうございます。
これは決まり事として覚えないといけないですね。
> これは決まり事として覚えないといけないですね。
'カッコつけたら星が取れる' と、そんだけ覚えれば十分。