C++ vượt qua giá trị hoặc tham chiếu

   main() {
      int i = 10, j = 20;
      swapThemByVal(i, j);
      cout << i << "  " << j << endl;     // displays 10  20
      swapThemByRef(i, j);
      cout << i << "  " << j << endl;     // displays 20  10
      ...
   }

   void swapThemByVal(int num1, int num2) {
      int temp = num1;
      num1 = num2;
      num2 = temp;
   }

   void swapThemByRef(int& num1, int& num2) {
      int temp = num1;
      num1 = num2;
      num2 = temp;
   }

Truyền tham chiếu có nghĩa là chuyển tham chiếu của một đối số trong hàm gọi đến tham số hình thức tương ứng của hàm được gọi. Hàm được gọi có thể sửa đổi giá trị của đối số bằng cách sử dụng tham chiếu của nó được truyền vào

Ví dụ sau đây cho thấy cách các đối số được truyền bằng tham chiếu. Các tham số tham chiếu được khởi tạo với các đối số thực khi hàm được gọi

CCNX06A

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}

Khi hàm

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
1 được gọi, giá trị của biến
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
2 và
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
3 được hoán đổi vì chúng được truyền theo tham chiếu. đầu ra là.
A is 20 and B is 10

Để sửa đổi một tham chiếu đủ điều kiện bởi từ hạn định

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
4, bạn phải loại bỏ hằng số của nó bằng toán tử
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
5. Ví dụ.
#include 
using namespace std;

void f(const int& x) {
  int& y = const_cast(x);
  ++y;
}

int main() {
  int a = 5;
  f(a);
  cout << a << endl;
}
Ví dụ này xuất ra
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
6

Truyền theo tham chiếu hiệu quả hơn truyền theo giá trị, vì nó không sao chép các đối số. Tham số chính thức là bí danh cho đối số. Khi hàm được gọi đọc hoặc ghi tham số hình thức, nó thực sự đọc hoặc ghi chính đối số đó

Sự khác biệt giữa pass-by-reference và pass-by-pointer là con trỏ có thể được

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
7 hoặc gán lại trong khi các tham chiếu thì không thể. Sử dụng chuyển từng con trỏ nếu
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
7 là một giá trị tham số hợp lệ hoặc nếu bạn muốn gán lại con trỏ. Nếu không, hãy sử dụng các tham chiếu không đổi hoặc không cố định để truyền đối số

Theo cách này, giá trị của đối số trong hàm gọi có thể được sửa đổi bởi hàm được gọi

Ví dụ sau đây cho thấy cách các đối số được truyền bằng tham chiếu. Trong C++, các tham số tham chiếu được khởi tạo với các đối số thực khi hàm được gọi. Trong C, các tham số con trỏ được khởi tạo giá trị con trỏ khi hàm được gọi

C++ vượt qua giá trị hoặc tham chiếu
Chỉ bắt đầu với C++

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}

C++ vượt qua giá trị hoặc tham chiếu
Chỉ kết thúc C ++

C++ vượt qua giá trị hoặc tham chiếu
Chỉ bắt đầu từ C

#include 

void swapnum(int *i, int *j) {
  int temp = *i;
  *i = *j;
  *j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(&a, &b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}

C++ vượt qua giá trị hoặc tham chiếu
Chỉ hết C

Khi hàm

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
1 được gọi, các giá trị thực của các biến
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
2 và
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
3 được trao đổi vì chúng được truyền theo tham chiếu. đầu ra là.
A is 20 and B is 10

C++ vượt qua giá trị hoặc tham chiếu
Chỉ bắt đầu với C++

Để sửa đổi một tham chiếu đủ điều kiện

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
4, bạn phải loại bỏ hằng số của nó bằng toán tử
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
5. Ví dụ sau minh họa điều này.
#include 
using namespace std;

void f(const int& x) {
  int& y = const_cast(x);
  y++;
}

int main() {
  int a = 5;
  f(a);
  cout << a << endl;
}
Ví dụ này xuất ra
#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
6

Cuộc gọi theo phương thức tham chiếu truyền đối số cho hàm sao chép địa chỉ của đối số vào tham số chính thức. Bên trong hàm, địa chỉ được sử dụng để truy cập đối số thực được sử dụng trong cuộc gọi. Nó có nghĩa là những thay đổi được thực hiện đối với tham số ảnh hưởng đến đối số đã truyền

Để truyền một giá trị bằng tham chiếu, các con trỏ đối số được truyền cho các hàm giống như bất kỳ giá trị nào khác. Vì vậy, theo đó, bạn cần khai báo các tham số của hàm dưới dạng các kiểu con trỏ như trong hàm hoán đổi () sau đây, hàm này trao đổi các giá trị của hai biến số nguyên được trỏ tới, bởi các đối số của chúng

________số 8

Bây giờ chúng ta hãy gọi hàm swap() bằng cách chuyển các giá trị theo tham chiếu như trong ví dụ sau –

#include 

int main () {

   /* local variable definition */
   int a = 100;
   int b = 200;
 
   printf("Before swap, value of a : %d\n", a );
   printf("Before swap, value of b : %d\n", b );
 
   /* calling a function to swap the values */
   swap(&a, &b);
 
   printf("After swap, value of a : %d\n", a );
   printf("After swap, value of b : %d\n", b );
 
   return 0;
}
void swap(int *x, int *y) {

   int temp;

   temp = *x; /* save the value of x */
   *x = *y;    /* put y into x */
   *y = temp; /* put temp into y */
  
   return;
}

Chúng ta hãy đặt đoạn mã trên vào một tệp C duy nhất, biên dịch và thực thi nó, để tạo ra kết quả sau -

#include 

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
0

Nó cho thấy rằng thay đổi cũng đã phản ánh bên ngoài chức năng, không giống như gọi theo giá trị trong đó các thay đổi không phản ánh bên ngoài chức năng

Tốt hơn là chuyển theo tham chiếu hoặc giá trị?

Sử dụng truyền theo giá trị khi bạn chỉ "sử dụng" tham số cho một số tính toán, không thay đổi tham số cho chương trình máy khách . Trong truyền theo tham chiếu (còn gọi là truyền theo địa chỉ), một bản sao địa chỉ của tham số thực tế được lưu trữ.

C có hỗ trợ cuộc gọi theo tham chiếu không?

Biến con trỏ cần xác định để lưu trữ giá trị địa chỉ của biến. Ghi chú. Trong C, chúng ta sử dụng con trỏ để gọi theo tham chiếu . Trong C++, chúng ta có thể sử dụng con trỏ hoặc tham chiếu để chuyển qua tham chiếu.

Chuyển qua tham chiếu có nhanh hơn trong C không?

Theo nguyên tắc thông thường, truyền theo tham chiếu hoặc con trỏ thường nhanh hơn truyền theo giá trị , nếu lượng dữ liệu được truyền theo giá trị .