• ベストアンサー

関数宣言時の引数の*&はどういう意味なのでしょうか?

void Func(TestClass*& test){ … } というような記述を見かけたのですが、TestClassの後ろについている *&はどういう意味なのでしょうか? どういう理由があってつけられているのでしょうか?

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

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

まず参照渡しについてはわかっているでしょうか? これはTestClass*の参照渡しです。 void Func(int*& test) { test = new int; } int main() { int* p; Func(p); *p = 10; return 0; } こうすればFunc内部で、pをnewしています。 もし void Func(int* test) { test = new int; } なら pにnewされたアドレスは反映されません。 以下のコードでpとtestが同じ値であることが確認できます 「*&」を「*」に書き換えるとtestとpが違う値になるでしょう。 #include <iostream> void Func(int*& test) { test = new int; std::cout << test << std::endl; } int main() { int* p = NULL; Func(p); std::cout << p << std::endl; return 0; }

toshiaki33
質問者

お礼

なるほど!ありがとうございます。*&という記述は、 以下のように、ポインタを、参照宣言された引数に渡す際に、 わざわざポインタはずしをしなくてすむような便宜なのだと勘違いしておりました。 #include <iostream> void Func(int& intRef){ intRef = 3; } int main(void){ int* p = NULL; //ポインタを参照に変えなくちゃいけないのでポインタはずし Func(*p); std::cout << *p << std::endl; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

TestClass へのポインタのリファレンスですよね。 ポインタの値(ポインタが指しているものではなく、ポインタの値そのもの)を Func 内で書き換えて戻したいのではないですか? void Func(TestClass **ptest) { *ptest = 0; } void Func(TestClass *&test) { test = 0; } とか。

toshiaki33
質問者

お礼

ポインタのポインタのC++版だったのですね!ありがとうございます。 すっきりしました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • _USERENTRYの意味

    例えば void Func(void (_USERENTRY *__Test)()); という関数と void Func(void ( *__Test)()); という関数があったとして、どちらもコンパイルできるし、動作上問題なく動いているように見えます。 _USERENTRYを付ける意味は何でしょうか?

  • 引数宣言の意味

    C++における引数宣言に関する質問です. サブルーチンに関して以下のように記述がありました. void Exam(int i,int j,double a[][NN],double &b) { b = ・・・ ; } このとき,bの宣言に&が付いていたのですが,これは どういう意味があるのでしょうか? C++の経験がないもので,よくわかりません. 基本的なことかもしれませんが,よろしくお願いいたします.

  • デフォルト引数の意味が解りません

    //正しい void func1(int a, int b, int c, int d=2, int e=10) 右から順にデフォルト引数を設定することができます。 //誤り void func2(int a, int b =2, int c, int d, int e=10) このようなデフォルト引数の指定はできません。 このfunc1()関数は次のように呼び出すことができます。 (1)func1(10, 5, 20); (2)func1(10, 5, 20, 30); (3)func1(10, 5, 20, 30, 50); (1)は、デフォルト引数を指定した二つの引数を省略して呼び出しています。つまり引数dは2、 eは、10で初期化されます。 (2)には、最後の引数を省略して呼び出しています。つまり、最後の引数eが10で初期化されます (3)は、すべての引数を指定して呼び出しています。 とあるのですが、まったく意味が解りません。 どうかこの問題を解る方解りやすく説明お願いします。  

  • デバッグ中の変数参照について

    VS2005のC++/CLIでアプリを作っているものです。 デバッグ中に作成したメソッドの引数に渡されて来る値をウォッチで 見ようとすると「エラー: 識別子 'str' はスコープ外です」となり 中身が見れません。 作成したクラスのメンバ変数は見れます。 以下が発生したソースです。 ---------------------------- TestClass.cpp ---------------------------- #include "StdAfx.h" #include "TestClass.h" using namespace System; TestClass::TestClass(void) { } // 追加メソッド void TestClass::func( String^ str ){ String^ tmp; tmp = str; } ---------------------------- TestClass.h ---------------------------- #pragma once using namespace System; ref class TestClass { public: TestClass(void); // 追加メソッド void func( String^ ); }; ---------------------------- Form1.h ---------------------------- #pragma once #include "TestClass.h" namespace test2 { (省略) public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // TestClass^ aaa = gcnew TestClass(); aaa->func( "あいうえお" ); } (省略) ---------------------------- プロジェクトは、CLRのWindowsフォームアプリケーションで作成しています。 初心者の質問ですが、宜しくお願い致します。

  • SystemC言語の文法(関数の引数にポインタ?)

    SystemC言語の文法について質問です。 ある雑誌で、ビット宣言変数のアドレスを関数に渡しており、 私も真似て作ってみたのですが、エラーが発生してしまいます。 --- (例) 引数にポインタを入れる処理 // 引数 sc_uint<32> *s の関数 void test::Calc_func( sc_uint<32> *s ) { cout << "s[0] = " << s[0]; // 32bitのデータ出力? } // これがmain文の代わりです void test::A_func(void) { sc_biguint<2048> a; sc_uint<12> i; for( i = 0; i < 2048; i++ ) { a[i] = 0; } Calc_func( &a[0] ); // ←問題! } // Error内容 Calc_funcの引数の入れ方が駄目! --- 色々、Calc_funcへの型を変えてやってみたのですが、 全くびくともしません。 雑誌が間違っている可能性は低いと思いまして、 今回、このような質問をさせていただきました。 インターネット上の情報でも、このような処理を 見つけることができませんでした。 どうぞよろしくお願いいたします。

  • 可変長引数をもつオーバライド関数について

    オーバライド関数について質問があります。 以下のようなクラスAとBがあります。 クラスAは基本クラスです。 クラスBはクラスAから導出しました。 ------------------------------------ CLASS A { public: virtual void func(char* p, ...); } ------------------------------------ CLASS B : public A { public: void func(char* p, ...); } ------------------------------------ メンバ関数の func() はオーバライド関数で、可変長の引数を持っています。 今、クラスBの func() の中で、クラスAの func() をコールするようにコーディングしました。 ----------------------------------- void B::func(char* p, ...) { : : A::func( ???? ) : : } ----------------------------------- ところが、クラスBの func()が受け取った引数を、そのままクラスAの func() に渡したいのですが、どうしたらいいのか分かりません。これって無理でしょうか? 教えて下さい。

  • 関数の引数なしを変数に代入したら入ってきた数値は何?

    デバッグソフトで自分のプログラムを動かしていたときに、 int test_func(char x) { x = x + 1; ------(中略)----------- return x; } int main(void) { int test_val; ------(中略)----------- test_val = test_func; ------(中略)----------- } このようにtest_func(char x)という関数の戻り値を変数test_valに代入するつもりだったのですが、間違って引数部分を書かずにコンパイルしてしまいました。 このときにコンパイルでエラーが出ると思ったのですが、コンパイル完了でデバッガで変数test_valをみてみると何か値が入っていました。 ちょっと気になったのですが、この変数の中に入った値はいったい何なのでしょうか。ご存じの方いらっしゃいましたらご教授お願いいたします。

  • 引数について(C言語)

    あるサイトでこんなソースを見たのですが、 void func(val) int val; { /*処理*/ } この引数の記述方法はどうなっているのでしょうか?回答よろしくお願いします。

  • ラムダ式を関数に渡したいのですが

    Class1からClass2にある関数の引数にラムダ式で関数を渡すようなプログラムを作ろうと思い、以下のようにコードを記述しました。 #include <iostream> class Class1 { int i = 0; void func() { std::cout << "Hello world" << std::endl; } void init() { Class2 *class2 = new Class2(); class2->setFunc([this] { func(); i++; }()); } }; class Class2 { void(*mFunc)(); void runFunc(){ mFunc(); } public: void setFunc(void func()) { mFunc = func; } }; すると class2->setFunc([this] { func(); i++; }()); のところで「型"void"の引数は型"void(*)()"のパラメーターと互換性がありません」というエラーが発生してしまいます。 キャプチャにthisを渡したラムダ式を他のクラスの関数ポインタのような変数に代入させるようにしたいのですがどのように記述したらできますか