Cpp 右辺値参照 新しいページはコチラ
提供: yonewiki
(→右辺値参照) |
(→右辺値参照) |
||
60行: | 60行: | ||
以下はキャストを必要としない右辺値参照のパターンです。 | 以下はキャストを必要としない右辺値参照のパターンです。 | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
+ | class CTest | ||
+ | { | ||
+ | public: | ||
+ | CTest(void){}; | ||
+ | ~CTest(void){}; | ||
+ | int getIntegerNum(void){return 1;}; | ||
+ | static int getIntegerNumStatic(void){return 1;}; | ||
+ | }; | ||
int Function(){ | int Function(){ | ||
return 1; | return 1; | ||
65行: | 73行: | ||
int _tmain(int argc, _TCHAR* argv[]) | int _tmain(int argc, _TCHAR* argv[]) | ||
{ | { | ||
− | int&& | + | CTest* pCTestInstance = New CTest; |
+ | int&& rrefnFReturn = Function();//OK。 関数の右辺値参照代入 | ||
+ | printf("rrefnFReturn Addres->%x, rrefnFReturn Value->%d\n",&rrefnFReturn,rrefnFReturn2); | ||
+ | |||
+ | int&& rrefnFReturn2 = Function();//2回目の関数の右辺値参照代入 | ||
+ | printf("rrefnFReturn2 Addres->%x, rrefnFReturn2 Value->%d\n",&rrefnFReturn2,rrefnFReturn2); | ||
+ | |||
+ | int&& rrefnCReturn = pCTestInstance->getIntegerNum();//OK。クラスメンバ関数の右辺値参照代入 | ||
+ | printf("rrefnCReturn Addres->%x, rrefnCReturn Value->%d\n",&rrefnCReturn,rrefnCReturn); | ||
+ | |||
+ | int&& rrefnCReturn2 = pCTestInstance->getIntegerNum();//OK。関数の右辺値参照代入 | ||
+ | printf("rrefnCReturn2 Addres->%x, rrefnCReturn2 Value->%d\n",&rrefnCReturn2,rrefnCReturn2); | ||
+ | |||
+ | int&& rrefnStaticCReturn = CTest::getIntegerNum();//クラス関数(static)の右辺値参照代入 | ||
+ | printf("rrefnStaticCReturn Addres->%x, rrefnStaticCReturn Value->%d\n",&rrefnStaticCReturn,rrefnStaticCReturn); | ||
+ | |||
+ | int&& rrefnStaticCReturn2 = CTest::getIntegerNum();//クラス関数(static)の右辺値参照代入 | ||
+ | printf("rrefnStaticCReturn2 Addres->%x, rrefnStaticCReturn2 Value->%d\n",&rrefnStaticCReturn2,rrefnStaticCReturn2); | ||
return 0; | return 0; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 出力結果 | |
+ | <syntaxhighlight lang="text"> | ||
+ | rrefnFReturn Addres->46fb5c, rrefnFReturn Value->1 | ||
+ | rrefnFReturn2 Addres->46fb44, rrefnFReturn2 Value->1 | ||
+ | rrefnCReturn Addres->46fc70, rrefnCReturn Value->1 | ||
+ | rrefnCReturn2 Addres->46fc58, rrefnCReturn2 Value->1 | ||
+ | rrefnStaticCReturn Addres->46fdd4, rrefnStaticCReturn Value->1 | ||
+ | rrefnStaticCReturn2 Addres->46fdbc, rrefnStaticCReturn2 Value->1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 上記のように関数の返り値も右辺値として扱われますので、'''返り値の型が一致すれば'''右辺値参照型への代入ができます。構造体やクラスのメンバ関数に対してもキャストすることなく右辺値として参照を受け取ることができます。関数は呼び出される都度、新しいアドレスに処理結果が返って来ています。 | ||
− | + | このような右辺値戻り値を引数にとるような関数で、ポインタ変数のアドレスだけを移動させることによる、付け替え関数を作ることができます。言葉での説明ではイメージできないと思うので、実際にやってみた方がいいですね。 | |
− | + | 戻り値を利用するとは、どういうことなのかを示す具体的なサンプルは作成中です。右辺値が必要になるようなプログラムって難しいですから、ちょっと時間下さい。っていつまでw |