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&& rrefnCnt = Function();//これはOK。
+
  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
+
戻り値を利用するとは、どういうことなのかを示す具体的なサンプルは作成中です。右辺値が必要になるようなプログラムって難しいですから、ちょっと時間下さい。っていつまでw

2014年10月23日 (木) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス