• ベストアンサー

アドレス渡し?

tsuduki123の回答

回答No.2

関数の引数として &が使われているので #1 の とおり、参照渡しですね。 C++の文法に関する本を読めば載っていると思いますが、 まぁ、簡単に説明すると 常に実体を参照するようになっている(実体が保証されている) ポインタだと考えればよいのではないのかなと。 サンプルとしてはあんまり見かけませんが、多態することができます。 ---- コンパイルテスト等していませんが、使い方のイメージとして。。。 ---- #include <cstdio> class Fruits { public: virtual ~Fruits(void){ ; } virtual void print_name(void) const { printf("謎の果物"); } }; class SpecialYellow : public Fruits{ }; class Apple : public Fruits { public: virtual void print_name(void) const { printf("りんご"); } }; class Banana : public Fruits { public: virtual void print_name(void) const { printf("ばなな"); } }; static void print( const Fruits &fruits ){ fruits.print_name(); } int main(void) { Apple a; Banana b; SpecialYellow c; print(a); print(b); print(c); return 0; }

flex1101
質問者

お礼

具体例を含めてのご回答ありがとうございます。

関連するQ&A

  • mainの外に変数 vs ポインタ渡し

    C++についての質問です。プログラミング初心者ですが、よろしくお願いします。 最近、関数の外側でも変数を宣言できることを知りました。関数の外側で変数を宣言すると、全ての関数でその変数にアクセスすることができ大変便利なように思います。 「わざわざポインタ渡しなどする必要はないのでは?」と思ってしまいました。 これは何か問題があるのでしょうか? 初心者の言葉で説明しても理解しにくいかと思いますので、例として「足し算するプログラム」を以下に記載します。 ポインタ渡しで書くと、以下のような感じになるかと思います。 //●ポインタ渡し #include "stdafx.h" #include <iostream> void func(int x,int y,int *pans){ *pans = x+y; } void main(){ int a=10, b=20, ans; func(a,b,&ans); std::cout << ans << std::endl; } しかし、mainの外に変数を宣言すれば //●mainの外に変数 #include "stdafx.h" #include <iostream> int a,b,ans; void func(int x,int y){ ans = x+y; } void main(){ a=10; b=20; func(a,b); std::cout << ans << std::endl; } ansをポインタ渡しする必要なく、funcの計算結果をansに代入できました。 「●mainの外に変数」のプログラムはどのような問題や危険性を孕んでいるのでしょうか? 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • 参照渡しで分からないことがあります。

    参照渡し 参照渡しで分からないことがあります。 以下のコードです。一部抜粋のコードです。 > class CSample > { > public: > CSample(){ m_num = 123; } // コンストラクタ > int& get(){ return m_num; } // メンバ変数を参照戻し > private: > int m_num; > }; > ~~~~~~~ >int& alias1 = get(); >alias1 *= 2; >int& alias2 = get() + alias1; // このようにブロックの途中で宣言できる ~~~~~~~ このコードの中の >int& alias2 = get() + alias1; が分からないところです。 参照をalias2に設定しているところだと思われますがget()の参照戻しのアドレスと alias1の参照のアドレスと2つの参照を設定しているのが分かりません、この2つは同じアドレスをさしているのでこのサンプルでは支障はないように思えますが。 この場合は、式右辺のget()+alias1の2つの参照を足しているのが分からないので教えてください。 なおこのコードが掲載されているサイトは以下です。 http://www.geocities.jp/ky_webid/cpp/language/015.html

  • C++ 関数プロトタイプと値渡し・参照渡しについて

    次のコードは、入門書にあった値渡しのサンプルです。 値渡しなので、a=5 ,b=10が出力されます。 void swap(int x,int y); //←抜けていた int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } void swap(int x,int y){ int tmp=x; x=y; y=tmp; } しかし、自分で入力したところ何故かa=10,b=5が出力されました。 (VisualC++2008で実行しました。) よく見てみると、上記1行目の関数プロトタイプが抜けていました。 入門書を読んだ限りでは、次の2点が理解できません。 (1)main関数の後ろにswap関数があり、関数プロトタイプが無いのでコンパイルエラーになるはずなのにならない (2)値渡しのはずなのに参照渡しと同じ結果になる よろしくお願いします。

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • 参照渡し と ポインタ渡し

    参照渡し と ポインタ渡し はどういう時に使い分けるんですか? VOID型の自作関数内でメインのブール値を書き替えたいんだけど #include <iostream.h> void ref( int &b ) { b = false; } void ptr( int *b ){ ( *b ) = true; } main(){  bool b = true;  ref( b );  cout << b;  ptr( &b );  cout << b; } だとコンパイルエラーでした。 うまくいくソースを教えてください。

  • 誤った関数に関する値渡しについて

    こんにちは、まずはソースを記述します。 #include<iostream> using namespace std; //誤ったswap関数の宣言 void swap(int x, int y); int main() { int num1 = 5; int num2 = 10; cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; cout << "変数num1とnum2の値を交換します。\n"; swap(num1, num2); cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; return 0; } //誤ったswap関数の定義 void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } >>関数内で仮引数xとyの値を交換する処理を行っていても、これは変数num1とnum2の値を「コピー」した5と10を交換しているにすぎません。 swap関数内で値を交換しても、呼び出し元の変数であるnum1とnum2に影響を与えることができません。 ・・の文章の中から質問ですが値渡しとはどういうことでしょうか? 参照渡しとはどう違うのでしょうか? ご教示お願いします。

  • 参照渡しの速度について

    内部の質問なのですが、 下の簡単な例を見てください。 #include <iostream> using namespace std; //構造体 struct data { int a,b,c; }; //グローバル変数 data data1; //関数 void set_data( data &dt ) { data1 = dt;//この部分について質問 } data get_data( void ) { return data1; } int main( void ) { data d1; d1.a = 1; d1.b = 2; d1.c = 3; set_data( d ); data d2 = get_data(); cout << d2.a << d2.b << d2c << endl; return 0; } ほんとに今適当に作った変なプログラムですが無いよりはましだと思い 書いときました。 //この部分について質問 のところなのですが、これはアドレスを渡しているのでしょうか? 普通の値渡しは 内部で data1.a = dt.a; data1.b = dt.b; data1.c = dt.c; が行われていると聞いた事があるのですが、 今回の場合もそうなのでしょうか? それともアドレス渡しのように アドレスを一つ渡すだけで早い処理が出来るのでしょうか? どなたか詳しい方お願いします。

  • ポインタのアドレス渡し。。。

    ポインタ配列を関数で渡す方法教えてください。 for(cnt1 = 0 ; cnt1 < 5 ;cnt1++) { for(cnt2=cnt1 + 1 ; cnt2 < 5 ;cnt2++) { ret=strcmp(srt[cnt1],str[cnt2]); if(ret>0)    { temp = str[cnt1]; str[cnt1] =str[cnt2]; str[cnt2] = temp; } } この並び替え処理を関数で渡したいのですが、 この処理を関数で以下のようにするとエラーが・・・ void sort(char *pstr,int cnt) { int ct1; int ct2; char *temp; for(ct1 = 0 ; ct1 < cnt-1 ;ct1++) { for(ct2=ct1 + 1 ; ct2 < cnt ; ct2++)   { ret=strcmp(pstr+ct1,pstr+ct2); if(ret>0) { temp = pstr+cnt1; pstr[ct1] = pstr[ct2]; pstr[ct2] = temp; }}} どのように渡せば良いのかわかる方教えていただけませんか??

  • servlet 値渡し

    servletを含む3つのファイルがあります。 例 struct.java( public String str = "0";) main.java( str = "1";) servlet.java( if( str.equals("1")){ 処理 } ) structで宣言したstrの値をmainで変更し、 その値("1")をservletで受け取りたいのですが どのような方法でやれば受け取れますか? struct.javaでpublicで宣言しているので パラメータ渡しではない方法を探しています。 そもそもservlet経由にするときは、 パラメータではないと無理なんでしょうか? アドバイスお願いします。

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }