こんばんは。
C言語→C++と移ったのでポインタで良いじゃん!ってことで参照をあまり使わないようにしてました。
しかし、現在読んでいる参考書に頻繁に現れるので使わないわけにはいかず・・・。
【質問】
ポインタの方が応用が利くような気がしますがどうなんでしょうか?
皆さんはどちらを好んで使われていますか?
場合によるならば双方のデメリットや例を挙げてもらえれば助かります(^^;
参照とポインタ の違い
Re:参照とポインタ の違い
一言で言えば、安全性の違いです。
ポイントは確かに参照よりも自由度が高いですが、
その分の危険度がつきまといます。
具体的に言えば、ポインタは指すものを自由に変更できるので、
あいまいなものを指したり、NULLポインタなどの形態を取りうるのですが、
参照は指すものを変えることが出来ないので、その心配はありません。
また、参照渡しは値渡しと区別しにくいというデメリットがあります。
渡した先で値を変更するようであれば、ポインタで渡したほうがで良いでしょうね。
ポイントは確かに参照よりも自由度が高いですが、
その分の危険度がつきまといます。
具体的に言えば、ポインタは指すものを自由に変更できるので、
あいまいなものを指したり、NULLポインタなどの形態を取りうるのですが、
参照は指すものを変えることが出来ないので、その心配はありません。
また、参照渡しは値渡しと区別しにくいというデメリットがあります。
渡した先で値を変更するようであれば、ポインタで渡したほうがで良いでしょうね。
Re:参照とポインタ の違い
ポインタと違って、参照は必ず初期化しないといけないので
クラスに、必ず参照先が有ることが保証されなければいけないメンバがある時には
ポインタでなく、参照を使用してます。
ただ、変な使い方をすると参照先が必ずあるとも保証されませんが...
例えば以下のコードはNG
こんなアホな使い方する人がいるとも思えませんが^^;
#include <stdio.h>
class test
{
private:
int & intref;
public:
test(int* p)
: intref(*p)
{
}
void func()
{
printf("%d\n", intref);
}
};
int main()
{
int* p = new int(100);
test c(p);
delete p;
c.func();
return 0;
}
クラスに、必ず参照先が有ることが保証されなければいけないメンバがある時には
ポインタでなく、参照を使用してます。
ただ、変な使い方をすると参照先が必ずあるとも保証されませんが...
例えば以下のコードはNG
こんなアホな使い方する人がいるとも思えませんが^^;
#include <stdio.h>
class test
{
private:
int & intref;
public:
test(int* p)
: intref(*p)
{
}
void func()
{
printf("%d\n", intref);
}
};
int main()
{
int* p = new int(100);
test c(p);
delete p;
c.func();
return 0;
}
Re:参照とポインタ の違い
オブジェクト型に限っていえば、ポインタには大きく分けて三つの用途があるかと思います。
・オブジェクトの参照
・反復子
・動的オブジェクトの管理
「ポインタ」という一種類の言語機能で、これだけのことを扱えるわけですし、しかも上記のうち複数を組み合わせることもできるわけですから、自由度が高いことは間違いありません。
しかし、その観点からすれば、いっそ型なんかなくして、アセンブリ言語のようにしてしまえば、さらに自由度が高まりますね。
自由度を落として制限を加えると、多くの場合、使い勝手や安全性は向上します。
「参照」は、ポインタの機能のうち、「オブジェクトの参照」しかサポートしませんが、逆にいえば、用途が明確であり、誤って他の目的に流用されたりする心配もありません。
もちろん、参照も万能ではありません。
MNSさんが書かれているように、結果の格納先を引数として渡すのであれば、多くの場合、ポインタを使う方がメリットが大きい気がします。
・オブジェクトの参照
・反復子
・動的オブジェクトの管理
「ポインタ」という一種類の言語機能で、これだけのことを扱えるわけですし、しかも上記のうち複数を組み合わせることもできるわけですから、自由度が高いことは間違いありません。
しかし、その観点からすれば、いっそ型なんかなくして、アセンブリ言語のようにしてしまえば、さらに自由度が高まりますね。
自由度を落として制限を加えると、多くの場合、使い勝手や安全性は向上します。
「参照」は、ポインタの機能のうち、「オブジェクトの参照」しかサポートしませんが、逆にいえば、用途が明確であり、誤って他の目的に流用されたりする心配もありません。
もちろん、参照も万能ではありません。
MNSさんが書かれているように、結果の格納先を引数として渡すのであれば、多くの場合、ポインタを使う方がメリットが大きい気がします。
Re:参照とポインタ の違い
MNSさん、gyzさん、たかぎさん回答していただきあいがとうございます。
>安全性
この説明で納得ができました。
ポインタを使っていて、無闇に変な物を指して、それを見ようとしていたことが何度となくありました。
今思えば、その部分を参照にしていれば実行前に気づいてたようにも思えます。
2つ使いこなせるように精進することにします。
まとめたレスで申し訳ありませんがありがとうございましたm(__)m
解決とします。
>安全性
この説明で納得ができました。
ポインタを使っていて、無闇に変な物を指して、それを見ようとしていたことが何度となくありました。
今思えば、その部分を参照にしていれば実行前に気づいてたようにも思えます。
2つ使いこなせるように精進することにします。
まとめたレスで申し訳ありませんがありがとうございましたm(__)m
解決とします。