• ベストアンサー

<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

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • 手続き型と関数型について。

    手続き型言語の定義は、「記述された命令を逐次的に実行し、処理の結果に応じて変数の内容を変化させていくプログラミング言語」となっていて、関数型言語の定義は、「数学的な言語仕様をもつプログラミング言語のこと。一度値を与えられた変数は常にその値を維持し、計算は計算結果を引数とした関数呼び出しの繰り返しとして行われる。」とあります。 関数型の、「一度値を与えられた変数は常にその値を維持し」はどういう意味ですか? 例えば、a=2とした後に、a=3などとすればaの値は変わっているのですが。 簡単な例で説明してください。

  • コンテキスト(Context)の意味がさっぱり分かりません。

    コンテキスト(Context)の意味について、下記のURLを参照しても意味が分からないしピンと来ないです。 http://kaden.yahoo.co.jp/dict/?type=detail&id=3730 私なりの解釈としては「つまり、コンテキストは、あらゆる型の引数を演算子や関数が、その引数の型に合わせて、返り値の型を選択する場合、その演算子や関数を呼び出す際の型がコンテキストである」ということです。 また、コンテキストは、どの状況において、どのような処理を応ずればいいのかという意味で考えています。このことを皆様はどう思いますでしょうか。ご意見をお聞かせください。 コンテキスト(Context)自体の言葉は意味が分かりづらいし、PHPのプログラミングでコンテキストの言葉はどのように使われますでしょうか。

    • ベストアンサー
    • PHP
  • 関数の引数と型

    関数の引数と型 TextBoxに数字しか入力できないようにする関数として Private Function fTextBoxNumberCheck(Byval MyTextBox as TextBoX)As Boolean という宣言文を目にしました。 Q1. Byval MyTextBox これは関数の呼び出し側では実引数としてText1,Text2のようなオブジェクト自体を 渡すことができるということでしょうか? 私の読んでいる入門書では実引数は変数ばかりなので・・・。 Q2. as TextBox これは入門書によれば実引数のデータ型となっていますが 調べてもTextBoxという型はありませんでした。 宣言文は関数のサンプルとして、その前後は記載されていませんでしたが、 どこかにTextBoxの宣言をしてあるはず(?)なのでしょうか? Yesとすればどのように書くのでしょうか?

  • 引数を含む変数を参照するには

    下記のような変数があります cd_01="a"; cd_02="b"; cd_03="c"; … で、引数で受け取った値を含む変数を参照したい場合、 例えば、引数で01を受け取った場合は、 cd_01の"a"を 02を受け取った場合は"b"を参照したいのです。 変数名「cd_xx」は可変です。 よろしくお願いします。

  • 変数に入っている変数の値を参照したい場合には

    var a1="123"; var a2="789"; と 変数に文字が登録されている場合、 引数として、1又は2を渡し、 1の場合にはa1を 2の場合にはa2の値を 参照することは可能ですか? switchやif文を使わずに、 別の変数に、"a"+引数を代入し、 その変数に代入されている変数を参照する というようなことは可能ですか? 意味わかりますか? すみません。 よろしくお願い致します。

  • 引数について質問

    私プログラミング初心者ですので、できるだけ優しい解説をしていただければ幸いです! 引数について、以下のような解説がありました。 「引数には仮引数と実引数の2種類が存在する。仮引数は、関数を定義する際に変数で指定する引数である。また、実引数は、プログラムの実行時に関数に引き渡される値となる引数である。つまり、関数の実行時には、実引数の値が仮引数に代入されることになる。」 質問:1「関数を定義する際に変数で指定する引数である。」という記述の中で「関数を定義」とありますが、実際のソースコードにおいて何に対応するかわかりません。簡潔なソースコードを交えて解説していただければ幸いです。 質問2:「関数を定義」に限らず、プログラミングにおいて「定義」という言葉をよく見ますが、これは本質的にどういう意味をもっているのでしょうか?具体的なソースコースコードを交えて解説してくださると幸いです。 もしかして、その定義とは例えば「public static void main(String arg[]){」のような「メソッド宣言」のことですか? 質問3:「関数の実行時には、実引数の値が仮引数に代入されることになる。」と書いてありますが、 これはどういうことですか、僕が実際にソースコードで記述してみるので、その考えが正しいか判定してください package 第4章; public class A { public static void main(String arg[]){ double x; x=Math.sqrt(2.0); System.out.println("2.0の平方根は"+x); } } 僕の考え:String arg[]が仮引数で、実引数2.0がString arg[]に代入されるってことでしょうか? 「定義」といえば、上記のソースコードでは、public static void main(String arg[]){ 以外見当たらないので、、 僕の考え2:Mathクラスは、標準クラス(javaが最初から備えているクラス)だから、プログラマが「関数を定義」しなくても予め関数が定義されているから、関数を定義する必要がない、ということでしょうか?

    • ベストアンサー
    • Java
  • 関数に値の代入 [C言語]

    C言語初心者です。関数とポインタについて勉強していたのですが、ふと関数の型を知りたくなってVC++で型を調べてみたんです。そしたら、void型で引数のない関数の型は void (__cdecl*)() となっていました。voidと__cdeclはわかります。 そしてこれ型に*が入ってるじゃないですか。ということは関数はポインタということになると思います。なので私はもしかしたら値の代入ができるのではないか、と思ったのです。早速、 f1=f2;(f1とf2は型と内容の同じ関数) や、 (*f1)=(*f2); としてポインタの中身や参照先の関数の実態の値を処理中に書き換えてみようとしました。ですが、多分そうなるとは思ったのですが、コンパイルエラーが出ました。 《エラーの内容》 error C2106:'=':左のオペランドが、左辺値になっていません。 warning C4550:式は引数リストのない関数として評価します。 関数を書き換えようとすること自体馬鹿げていることは重々承知です。でも、微かにいけそうな気がするんですよ。代入させたくないなら関数の型は一律constにすると思うし(実際関数をconstをつけて宣言してもOKだった、(プロトタイプ有り無しでも))、関数への代入は問答無用で駄目なのならばそういうエラーメッセージを出すと思うんです。 関数の書き換えは100%無理でしょうか?それとも関数を書き換える方法があるでしょうか?回答よろしくお願いします。

  • VBA超初心者の質問ですけど・・・

    VBAを勉強しています。超初心者の質問なんですけど、モジュール 変数 引数 関数 定数 このへんのことがごっちゃでよく区別がつきません。軽い説明でもいただけたらうれしいです!教えてくださいm(__)m

  • C言語のポインタによる関数の引数の書き方について教えてください。

    C言語を今勉強中の大学生です。 一気に複数の値をmainに返せる、参照による呼び出しによる関数の引数の書き方で困っています。配列を自作関数に引き渡したいのですが、どう書けばいいのでしょうか。 下の3つは、それぞれ(1)mainからの呼び出し、(2)自作関数での引数の引き受け、です。どこをどう変えたらエラーが出なくなるのか、分かる方、お願いいたします! (1)school(&m,h); (2)void school(int *m, float *h){ ※ちなみに変数は int m,float h[10][10]

専門家に質問してみよう