- ベストアンサー
<VC++>実務で
こんにちは。 度々こちらでお世話になっている者です。 ただいまC++のプログラミングを勉強しているのですが、 実務で"参照"型の変数を使うことはあるのでしょうか? というのも、ある関数の引数が参照型の変数であった場合は、 その関数の呼び出し側では、参照型(値の変更が可能)かどうかの区別が しにくくなると書物で読み、実際のところ参照は使われるのかどうか疑問に思ったからです。 お時間に余裕がございましたら教えていただけないでしょうか? どうぞよろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
参照型っていう、言葉そのものが、混乱になっているようですが・・・ たとえば、 int f(int &a, string &s) の時の、aや、sの型のことを言っておられますよね? (と一応、確認しておきます。) よく使いますよ。と言うか、必須に近いかと・・・。 特に、関数の引数には、よく使います。 その理由ですが、主に効率に由来します。組込型に関しては、まぁ、そんなに気にすることも無いかもしれません。が、クラスを引数に渡したときには、てきめんに効果が出ます。 たとえば、 class a_class; int f2(a_class a); なんて、関数に成ったとき、関数に引数を引き渡すときと、コピーコンストラクターを呼び出すことになります。コピーが簡単にできれば、問題はありませんが・・・そうでないことも多々あります。(たとえば、巨大なメンバー変数を抱えていてコピーに時間がかかるとか。)また、コピーの際の例外の扱いというちょっと嫌らしい問題も発生します。 まぁ、何にしても無駄なコピーです。 int f2(a_class &a); としておけば、この無駄なコピーは無くなります。確かに、このままでは、aは関数内で変更されてしまうのではないだろうか?という疑念は出ます。そういうときには、次のようにします。 int f2(const a_class &a); これで、aが変更できないことは、コンパイラが保証してくれます。constという予約語はこういうときに、積極的に使うものです。 効率の意味では、ポインター渡しにしてもよい場合もありますが、演算子のオーバーロードでは、その手も使えませんし、このやり方が必須になります。 たとえば、 bool operator==(const my_class_a &a, const my_class_b &b); とかですね。パラメーターをポインター渡しにしたら、意味が変わってしまいます。 また、例外を受け取る際には、必ず、参照型で捕まえなければなりません。これは、値で補足すると、例外の型が、補足したときの型に切り捨てられてしまうからです。 たとえば、標準の例外クラスで、 class exception; から、自分の例外型を派生させます。 class my_exception : public exception { public: virtual const char * what() throw(); } としたとします。 で、この my_exceptionを次のように補足するとどうなるかという問題です。 catch (exception e) { cerr << e.what(); } この場合、呼び出されるのは、exception::what()です。my_exception::what()ではありません。 catch (exception &e) { としておけば、ちゃんと、my_exception::what()が呼び出されます。 と言った具合に、結構、参照型って使いますよ。
その他の回答 (5)
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 度々書き込み申し訳ありません(.. 改めて調べてみましたら、Cでポインタを使った参照渡しの仕方について、「参照渡し」という言葉が適切か、という所が曖昧のようですね(^^; C++だけに使った方が、という意見 ・http://forums.belution.com/ja/vc/000/223/33.shtml Cにも「参照渡し」という言葉を使ってる文献 ・http://forums.belution.com/ja/vc/000/223/33.shtml どらちが正しい意見かは分かりません(^^; 本題と直接関係ありませんが、関連性がありそうな所なので書き込ませて頂きました(.. 参考になれば幸いです(..
お礼
ややこしいですよね。 私こそ、質問時の説明不足で誤解を招いてしまい、大変申し訳ございませんでした。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 sha-girlさん、ご指摘ありがとうございます。 「参照渡し」と「参照型」を混同していました(^^; 誤った情報申し訳ありませんでしたm(_ _)m
お礼
いえいえ!とんでもございません。 参考HPを見させていただきました。ありがとうございます!
- sha-girl
- ベストアンサー率52% (430/816)
ちょっと横槍失礼します。 WIN32APIで参照型をつかっているものは無いと思います。 参照型はC++の機能でCでは使えません。 WIN32APIでは構造体のポインタを引数にもつものが多いので それと勘違いなされているのでは? 間違っていたらごめんなさい。
お礼
アドバイスありがとうございます!
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 もし、参照型の有効性についていまいちピンとこない場合は、WIN32APIを少し勉強してみると良いです。 参照型がふんだんに使用されており、「もし参照型以外でこれを実現するには・・・」と逆に考えてみると、参照型の良いところも見えてくると思います。 参考になれば幸いです(..
お礼
ありがとうございます! WIN32のAPIですか。私にはまだ未知の領域でした。 参照が多用されることも含め、心に留めておきます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 実務で"参照"型の変数を使うことはあるのでしょうか? かなり多用します。
お礼
度々ありがとうございます!
お礼
永久保存版レベルの知識を教えていただき、どうもありがとうございます!