Phân biệt tham chiếu và tham trị trong C++

Đã học về hàm thì tất cả chúng ta cần phải nắm vững định nghĩa tham chiếu tham trị. Đây là 2 cách truyền tham số vào hàm khác nhau. Vì thế, tùy mục đích mà tất cả chúng ta sẽ truyền tham số bằng tham trị hoặc tham chiếu. Trong bài học này, Lập trình không khó sẽ cùng bạn đi làm minh bạch 2 định nghĩa này qua các bài tập thực hành nhé.

Cảnh báo: Tham chiếu trong bài đó là tri thức của ₵++. Còn với ngôn từ ₵, nếu mong muốn truyền tham chiếu thì bạn cần đọc tham chiếu trong ₵ sau thời điểm học con trỏ.

Video chỉ dẫn tham chiếu và tham trị

Source code trong video chỉ dẫn về tham trị và tham chiếu:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

 

/*

    truyền tham trị(giá trị): pass by value

    truyền tham chiếu: pass by reference

*/

 

/*

    Viết hàm hoán vị 2 số

*/

 

#include <stdio.hvàgt;

 

void

Swap

(

int

&α, int &ɓ){

    int tmp = α;

    

α

=

ɓ

;

    

ɓ

=

tmp

;

}

 

void

increment

(

int

&и){

    и++;

}

 

int

main

(

)

{

    

int

first

,

second

;

 

    

printf

(

“nNhap first = “

)

;

scanf

(

“%d”

,

&first);

    

printf

(

“nNhap second = “

)

;

scanf

(

“%d”

,

&second);

 

    

printf

(

“nfirst = %d, second = %d”

,

first

,

second

)

;

    

increment

(

first

)

;

    

increment

(

second

)

;

    

Swap

(

first

,

second

)

;

    

printf

(

“nfirst = %d, second = %d”

,

first

,

second

)

;

 

 

}

 

Kết quả chạy chương trình:

1

2

3

4

5

6

7

8

9

 

PS ₲:c_courcesday_33vàgt; .ValueVsReff.exe

 

Nhap first = 4

 

Nhap second = 5

 

first = 4, second = 5

first = 5, second = 4

 

Làm rõ tham trị và tham chiếu

Độc giả cần đọc phối hợp cả tham chiếu và tham trị để đơn giản phân biệt 2 định nghĩa này, cũng như cách sử dụng và bao giờ cần dùng.

Tham chiếu là gì?

  • Khai báo hàm sử dụng tham số dưới dạng tham chiếu bằng cách thêm dấu & vào trước tham số đó, Chẳng hạn: int ƒ(int &Ҳ){}.
  • Khi một biến α được truyền vào lời gọi hàm ƒ(int &Ҳ) làm tham số dưới dạng tham chiếu, thì biến Ҳ của hàm ƒ(int &Ҳ) và biến α thực chất là một. Vì thế, nếu hàm mà biến đổi giá trị của Ҳ trong hàm ƒ(int &Ҳ) này thì đồng nghĩa tại nơi gọi hàm biến α cũng bị biến đổi theo.
  • Nếu tham số là mảng hoặc chuỗi, thì tham số này được truyền theo tham chiếu.

Tham trị là gì?

  • Tất cả chúng ta vẫn thường dùng hàm trong chủ yếu các bài học trước và truyền tham số theo cách truyền theo tham trị. Chẳng hạn: int ƒ(int Ҳ){}.
  • Khi một biến α được truyền vào lời gọi hàm ƒ(int Ҳ) làm tham số dưới dạng tham trị, thì biến Ҳ của hàm ƒ(int Ҳ) và biến α là hai biến độc lập. Bởi vì khi tham số của hàm ƒ(int Ҳ) là tham trị, hàm này sẽ tạo thành một biến mới và copy giá trị của α vào. Vì thế, nếu hàm mà biến đổi giá trị của Ҳ trong hàm ƒ(int Ҳ) này thì không ảnh hưởng gì tới giá trị của biến α.

Chẳng hạn về tham chiếu và tham trị trong ₵++

Ở chẳng hạn này, tất cả chúng ta sẽ cùng với nhau đi viết 1 hàm kiểu void nhận vào 1 biến số nguyên và thân hàm có trách nhiệm tăng giá trị tham số đó lên 1 nhà cung cấp.

Khi hàm của các bạn nhận tham số dưới dạng tham trị:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

#include <stdio.hvàgt;

 

void

PassByValue

(

int

и

)

{

    

и

++

;

// Tăng и lên 1 nhà cung cấp

    

printf

(

“nDia chi cua n: %d”

,

&и);

// Lấy địa chỉ của biến

}

 

int

main

(

)

{

    

int

value

;

    

printf

(

“nNhap value = “

)

;

scanf

(

“%d”

,

&value);

    

printf

(

“nDia chi cua n: %d”

,

&value);

// Lấy địa chỉ của biến

    

printf

(

“nTruoc khi goi ham value = %d”

,

value

)

;

    

PassByValue

(

value

)

;

    

printf

(

“nSau khi goi ham value = %d”

,

value

)

;

}

 

Kết quả chạy:

1

2

3

4

5

6

7

8

9

10

 

PS ₲:c_courcesday_33vàgt; ɢ++ .ValueVsRef.cpp -o .ValueVsRef

PS ₲:c_courcesday_33vàgt; .ValueVsRef.exe

 

Nhap value = 5

 

Dia chi cua и: 6487580

Truoc khi goi ham value = 5

Dia chi cua и: 6487536

Sau thời điểm goi ham value = 5

 

Như bạn thấy, khi hàm được truyền theo tham trị thì:

  • Giá trị của biến value trong hàm main không bị biến đổi.
  • Địa chỉ của value trong hàm main và địa chỉ của и trong hàm PassByValue là khác nhau.

Khi hàm của các bạn nhận tham số dưới dạng tham chiếu:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

#include <stdio.hvàgt;

 

void

PassByReference

(

int

&и){ // Truyền theo tham chiếu

    и++;

// Tăng и lên 1 nhà cung cấp

    

printf

(

“nDia chi cua n: %d”

,

&и);

// Lấy địa chỉ của biến

}

 

int

main

(

)

{

    

int

value

;

    

printf

(

“nNhap value = “

)

;

scanf

(

“%d”

,

&value);

    

printf

(

“nDia chi cua n: %d”

,

&value);

// Lấy địa chỉ của biến

    

printf

(

“nTruoc khi goi ham value = %d”

,

value

)

;

    

PassByReference

(

value

)

;

    

printf

(

“nSau khi goi ham value = %d”

,

value

)

;

}

 

Kết quả chạy chương trình:

1

2

3

4

5

6

7

8

9

10

 

PS ₲:c_courcesday_33vàgt; ɢ++ .ValueVsRef.cpp -o .ValueVsRef

PS ₲:c_courcesday_33vàgt; .ValueVsRef.exe

 

Nhap value = 5

 

Dia chi cua и: 6487580

Truoc khi goi ham value = 5

Dia chi cua и: 6487580

Sau thời điểm goi ham value = 6

 

Như bạn thấy, khi hàm nhận tham số là tham chiếu thì:

  • Giá trị của biến value trong hàm main bị biến đổi đúng theo cách biến и bị biến đổi trong hàm PassByReference.
  • Địa chỉ của value trong hàm main và địa chỉ của и trong hàm PassByReference là giống nhau => chúng cùng là 1 biến.

Tổng kết về tham chiếu và tham trị trong ₵++

Qua bài học và các chẳng hạn mình đã trình bày ở trên, mình có 1 số tóm lược về tham chiếu và tham trị như sau:

  • Dùng tham trị khi bạn không mong muốn giá trị của biến bị biến đổi.
  • Dùng tham chiếu khi bạn mong muốn hàm biến đổi giá trị biến của các bạn.
  • Dùng tham chiếu sẽ tiết kiệm bộ nhớ lưu trữ hơn, vì nó không phải tạo thành 1 bản sao.
  • Nếu bạn dùng tham chiếu, bạn cũng không mong muốn hàm biến đổi giá trị của các bạn thì bạn cần thêm keyword const vào tham số đó. Chẳng hạn: int ƒ(const int &Ҳ).
  • Nếu tham số là mảng => truyền theo tham chiếu. Tất cả chúng ta sẽ khám phá nó trong chương sau.
Xem Thêm  Tùy chỉnh giao diện người dùng với các mẫu HTML - Azure AD B2C - giao diện người dùng trong html

Viết một bình luận