• ベストアンサー

参照型で受け取った引数をポインター型に渡す方法

参照型で受け取った引数をポインター型に渡す場合は、 どのようにすればよいのでしょうか? 私は参照型の理解がすっぽりぬけています。 参照型はC++で導入された方法で、何がメリットで何がデメリットでしょうか? void pointer_test(AA *b) { ... } void test(AA &a) { pointer_test( ??? ); }

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

pointer_test( &a ); ですね。a は AA型なので、AAへのポインタを渡すに&を付けるのは普通の変数と同じです。 >何がメリットで何がデメリットでしょうか? メリットは見やすいこと。デメリットは特にないと思います。 しいて言うと、ポインタで受けるのと参照で受けるのを無原則に使うと混乱しやすいと言うことでしょうか(参照自体のデメリットではないですけど)。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

参照型を引数にすることのデメリットはその関数呼び出しを見ただけでは、参照渡しをしているのか値渡しをしているのかわからないことではないでしょうか? 例えば、test(a); という関数呼び出しを見たときに、test() のプロトタイプが void test(AA&) なのか、void test(AA) なのかわかりませんが、たいてい後者だと思う傾向にあります。 参照渡しされた変数の内容がその副作用で変更されるような場合には、参照渡しでなくポインタで渡した方がよいように思われます。 例えば、test(&a) という関数呼び出しを見れば、プログラマはその関数プロトタイプを確認して、const がつかない void test(AA*) のような宣言かどうかを気にするのではないでしょうか?

関連するQ&A

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • ポインタ変数への参照について

    現在とあるDLLを作成中なのですが、メソッドの仕様で悩んでいます。 DLL内部で不正アクセス等を極力発生させないことを考えているのですが、ポインタを引数にとるメソッドの場合、引数に不正なアドレスを渡されるとメソッド内部で引数を参照した段階で不正アクセスで落ちてしまいます。この対応は、引数を参照とすることで解決しようと思っているのですが、ダブルポインタを引数にとるメソッドで同じ考え方をすると、メソッドの仕様が理解しづらいものになってしまいます。 下記がサンプルコードです。 class Test { public: Test() { m_test = 1; } int m_test; }; void GetTest1(Test** test) //もともとの仕様はこんな形 { *test = new Test(); } void GetTest2(Test*& test) //参照渡しにすると「*&」と書かなくてはならない { test = new Test(); } int main() { Test* get1; Test* get2; GetTest1(&get1); GetTest2(get2); delete get1; delete get2; return 0; } このように、「ポインタの参照」にすれば不正なポインタを渡される心配はなくなりますが。 「*&」など(私は)見たことも無いような記述になってしまいます。 このような書き方は一般的に考えて正しいのでしょうか? (特にDLLが提供するメソッドとして)

  • ダブルポインタの参照方法について

    いつも参考にさせていただいております。 C++初心者です。初歩的なことかとは思いますが、ご教授願います。 ポインタリストを引数にもつメソッドを作成しています。 この時にリストからイテレータを取り出しているのですが、ポインタからさらにポインタを 取り出しているのでダブルポインタ?になるみたいなのですが、取り出したクラスのメンバ関数の 参照方法がわかりません。->で参照するとビルドした時にコンパイルエラーが発生します。 基本的なことだとは思いますが、ご教授お願い致します。 下記サンプルコード class test { public: test(void); virtual ~test(void); TCHAR* WINAPI GetName(); void WINAPI SetName(const TCHAR* value); } BOOL WINAPI test::test(list<test *> testlist) { list<test *>::iterator itTest = testlist.begin(); while(itTest != searchCondition.end()) { itTest ← ここでGetNameを参照したい } }

  • ポインタ引数をさらにポインタ引数に渡す方法

    ポインタ引数をさらに関数のポインタ引数として設定するには、 どうしたらよいのでしょうか? イメージとしては、 int 関数A(*a *b) { *a = 5; *b =3; 関数B(*a *b) } またポインタ引数の関数内で、 ポインタ指定せずに変数を使えるのでしょうか? int 関数A(*a *b) { a = 5; b =3; 関数B(*a *b) }

  • ポインタのポインタが引数にある関数の使い方。

    ポインタのポインタが引数にある関数の使い方。 現在、このポインタのポインタが引数にある関数の動きがわからず困っています。 int test(int ** head) { int * pTail = (int *)*head; pTail = pTail + 1; } もし、この関数を呼び出して使用した場合どのような動きをするのでしょうか? int * comm_msg; これをグローバルポインタ変数として宣言させて、 test((void **)&comm_msg); このように呼び出したとした場合とさせていただきます。

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

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

  • ポインタのポインタを引数にもった関数から値を得たい

    すいません。 似たような題も多かったのですが、初心者のため、わかりませんでした。 質問させてください。  ポインタのポインタを引数にもった関数を作りたいのですが、まったくわかりません。 (ポインタであれば、何とかできたのですが…) 例を作ってみました。下記で、dd[2][2]にtest2関数から値を得るとします。 ?1と?2、?3に何を入れたらよいでしょうか?  (?1で得られる値は何でもかまいません。) きわめて抽象的で、申し訳ないのですが、どうぞよろしくお願い致します。 void test2(double **d1) { ?1 } void C_testDlg::OnBnClickedButton1() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 double dd[2][2]; ?2 test2(?3); CString cs; cs.format("%g", dd[1][2]) ::AfxmessageBox(cs); }

  • 構造体を値で渡す良い点はありますか?

    C言語で以下のように引数に値を渡す場合とポインタを渡す場合では、 どんなメリットデメリットはあるのでしょうか? 普段はポインタばかり渡していたので、値を渡す経験がなく疑問に思いました。 構造体を値で渡す良い点はありますか? struct sample { int a; int b; }; void test1(struct sample sa){} void test2(struct sample *sa){}

  • 関数ポインタについて

    関数ポインタを使用する際に、 指定する先の関数でデフォルト引数が指定されている場合、 関数ポインタを用いて、その引数を省略して呼び出すことはできるのでしょうか? 以下例とします。 void function(int a = 10){}; typedef void (*test)(int a); test a = &function; a(); //このように呼び出したい

専門家に質問してみよう