• ベストアンサー

<VC++>実務で

こんにちは。 度々こちらでお世話になっている者です。 ただいまC++のプログラミングを勉強しているのですが、 実務で"参照"型の変数を使うことはあるのでしょうか? というのも、ある関数の引数が参照型の変数であった場合は、 その関数の呼び出し側では、参照型(値の変更が可能)かどうかの区別が しにくくなると書物で読み、実際のところ参照は使われるのかどうか疑問に思ったからです。 お時間に余裕がございましたら教えていただけないでしょうか? どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.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()が呼び出されます。  と言った具合に、結構、参照型って使いますよ。

ketchappt
質問者

お礼

永久保存版レベルの知識を教えていただき、どうもありがとうございます!

その他の回答 (5)

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.5

こんにちは、honiyonです。  度々書き込み申し訳ありません(..  改めて調べてみましたら、Cでポインタを使った参照渡しの仕方について、「参照渡し」という言葉が適切か、という所が曖昧のようですね(^^; C++だけに使った方が、という意見 ・http://forums.belution.com/ja/vc/000/223/33.shtml Cにも「参照渡し」という言葉を使ってる文献 ・http://forums.belution.com/ja/vc/000/223/33.shtml  どらちが正しい意見かは分かりません(^^;  本題と直接関係ありませんが、関連性がありそうな所なので書き込ませて頂きました(..  参考になれば幸いです(..

ketchappt
質問者

お礼

ややこしいですよね。 私こそ、質問時の説明不足で誤解を招いてしまい、大変申し訳ございませんでした。

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.4

こんにちは、honiyonです。 sha-girlさん、ご指摘ありがとうございます。  「参照渡し」と「参照型」を混同していました(^^;  誤った情報申し訳ありませんでしたm(_ _)m

参考URL:
http://black.sakura.ne.jp/~third/programming/cs/cs20.html
ketchappt
質問者

お礼

いえいえ!とんでもございません。 参考HPを見させていただきました。ありがとうございます!

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

ちょっと横槍失礼します。 WIN32APIで参照型をつかっているものは無いと思います。 参照型はC++の機能でCでは使えません。 WIN32APIでは構造体のポインタを引数にもつものが多いので それと勘違いなされているのでは? 間違っていたらごめんなさい。

ketchappt
質問者

お礼

アドバイスありがとうございます!

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。  もし、参照型の有効性についていまいちピンとこない場合は、WIN32APIを少し勉強してみると良いです。  参照型がふんだんに使用されており、「もし参照型以外でこれを実現するには・・・」と逆に考えてみると、参照型の良いところも見えてくると思います。  参考になれば幸いです(..

ketchappt
質問者

お礼

ありがとうございます! WIN32のAPIですか。私にはまだ未知の領域でした。 参照が多用されることも含め、心に留めておきます。

回答No.1

> 実務で"参照"型の変数を使うことはあるのでしょうか? かなり多用します。

ketchappt
質問者

お礼

度々ありがとうございます!

関連するQ&A