首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 函數參數傳遞:引用與指針的實戰差異對比

     編輯:關於C語言

遊戲開發中直線軌跡運算用 DDA 演算法。C 版本用指針參數,C++ 改用引用,對比鮮明。

函數原型對比

// C 風格指針
static bool autoMove(int* x1, int* y1, int x2, int y2, int speed);

// C++ 引用
static bool autoMove(int& x1, int& y1, int x2, int y2, int speed);

實現代碼對比

指針版(C)

bool Tool::autoMove(int* x1, int* y1, int x2, int y2, int speed) {
  int x_old = *x1, y_old = *y1, x_new, y_new, step_time = 0;
  double x = *x1, y = *y1, deltx, delty, length;
  if (*x1 == x2 && *y1 == y2) return TRUE;
  length = (abs(x2 - *x1) >= abs(y2 - *y1)) ? abs(x2 - *x1) : abs(y2 - *y1);
  if (length < 1) return TRUE;
  deltx = (x2 - *x1) / length; delty = (y2 - *y1) / length;
  int k = 1;
  while (k <= length) {
    x += deltx; y += delty;
    x_new = (int)x; y_new = (int)y;
    if (x_old != x_new || y_old != y_new) {
      x_old = x_new; y_old = y_new; step_time++;
    }
    if (step_time >= speed) { *x1 = (int)x; *y1 = (int)y; return FALSE; }
    k++;
  }
  *x1 = (int)x; *y1 = (int)y; return FALSE;
}

引用版(C++)

bool Tool::autoMove(int& x1, int& y1, int x2, int y2, int speed) {
  int x_old = x1, y_old = y1, x_new, y_new, step_time = 0;
  double x = x1, y = y1, deltx, delty, length;
  if (x1 == x2 && y1 == y2) return TRUE;
  length = (abs(x2 - x1) >= abs(y2 - y1)) ? abs(x2 - x1) : abs(y2 - y1);
  if (length < 1) return TRUE;
  deltx = (x2 - x1) / length; delty = (y2 - y1) / length;
  int k = 1;
  while (k <= length) {
    x += deltx; y += delty;
    x_new = (int)x; y_new = (int)y;
    if (x_old != x_new || y_old != y_new) {
      x_old = x_new; y_old = y_new; step_time++;
    }
    if (step_time >= speed) { x1 = (int)x; y1 = (int)y; return FALSE; }
    k++;
  }
  x1 = (int)x; y1 = (int)y; return FALSE;
}

調用處對比

// 指針調用
bool isAutoMoveOk = Tool::autoMove(&x, &y, map_destination_x, map_destination_y, speed);

// 引用調用
bool isAutoMoveOk = Tool::autoMove(x, y, map_destination_x, map_destination_y, speed);

結論

  • 指針版函數體內到處是 *x1、*y1,閱讀寫入極其繁瑣。
  • 引用版語法清爽,如同直接操作變數本身,幾乎零修改成本(僅調用處去掉 &)。
  • C 語言無選擇只能用指針;C++ 優先選擇引用,好處多多:可讀性、安全性、避免空指針解引用風險。

本文出自「鍵碼視窗」博客,轉載請保留出處:https://kome2000.blog.51cto.com/969562/1287080

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved