Đào tạo khoa học máy tính không thể làm cho bất cứ ai trở thành lập trình viên hàng đầu, cũng như học cách sử dụng cọ và màu không thể làm cho bất cứ ai trở thành họa sĩ hàng đầu. Eric S. Raymond
STDIO Hiểu biết và vận dụng linh hoạt biến tham chiếu trong C++ là một yêu cầu thiết yếu đối với mỗi lập trình viên khi tìm hiểu về ngôn ngữ này.
Nội dung bài viết

Giới thiệu

Tham chiếu trong C++ là một khái niệm không mới xong không phải bất cứ lập trình viên nào cũng có nhìn nhận đầy đủ về nó. Vì vậy, bài viết này nhằm giới thiệu cho các bạn về biến tham chiếu trong C++.

Tiền đề bài viết

Do trong quá trình làm việc trước đây, tôi đã rất bối rối trong việc sử dụng tham chiếu sao cho chính xác và hiệu quả. Sau một quá trình tìm hiểu và rèn luyện tôi đã có được những kiến thức nhất định về tham chiếu. Vì vậy, với bài viết này, tôi mong muốn gửi tới bạn đọc một lượng kiến thức về tham chiếu mà tôi có được trong quá trình học tập.

Đối tượng hướng đến

Bài viết hướng đến các bạn chưa có sự phân biệt rõ ràng giữa tham chiếu và tham trị.

Tham chiếu

Định nghĩa và cú pháp khai báo

Tham chiếu nói một cách đơn giản là một bí danh của một biến. Nói cách khác, tham chiếu là một tên gọi khác của một biến đã có sẵn. Điều đó có nghĩa là, có thể thao tác trên biến đó thông qua tên biến hoặc tham chiếu.

Cú pháp <Tên kiểu tham chiếu>& <Tên biến>

Tại sao phải sử dụng tham chiếu?

Để hiểu rõ lý do của việc sử dụng tham chiếu, các bạn hãy xem một ví dụ đơn giản sau:

#include <iostream>
using namespace std;

void Swap1(int param1, int param2)
{
	int temp = param1;
	param1 = param2;
	param2 = temp;
}

void Swap2(int& param1, int& param2)
{
	int temp = param1;
	param1 = param2;
	param2 = temp;
}

int main()
{
	int a = 1024;
	int b = 2048;

	cout << "a = " << a << ", b = " << b << endl;

	cout << "Swap1: ";
	Swap1(a, b);
	cout << "a = " << a << ", b = " << b << endl;

	cout << "Swap2: ";
	Swap2(a, b);
	cout << "a = " << a << ", b = " << b << endl;

	return 0;
}

// Difference between value parameter and reference parameter
// a = 1024, b = 2048
// Swap1: a = 1024, b = 2048
// Swap2: a = 2048, b = 1024

Bạn có thắc mắc câu chuyện đằng sau 2 hàm trên không? Tôi sẽ giải thích bằng hình ảnh sau đây:

ss_1
Truyền tham trị: param1 và param2 chỉ là 2 bản sao chép của a và b

ss_2
Truyền tham chiếu: param1 và param2 cũng chính là a và b

Hàm Swap1 tôi sử dụng cách truyền tham trị. Trong khi, hàm Swap2 tôi sử dụng cách truyền tham chiếu. Và kết quả, như các bạn thấy ở trên. Lý do tại sao vậy? Thông thường, chúng ta hay sử dụng tham trị nhiều và “bị” quen thuộc với nó. Tuy nhiên, như bạn thấy đó, rõ ràng mong muốn của chúng ta khi viết hàm trên là có thể đổi chỗ được 2 số 1024 và 2048. Nhưng với cách truyền tham trị, mong muốn đó không thực hiện được, trong khi, sử dụng tham chiếu hoàn toàn có thể làm được điều này.

Rõ ràng, việc truyền tham trị trong trường hợp này, không những không đáp ứng được mong muốn ban đầu, mà còn gây thêm chi phí cho việc tạo ra 1 bản copy của tham số và thao tác trên đó mà không thu được kết quả gì. Vì thế, trong những trường hợp cần thay đổi giá trị của biến, bạn hãy nghĩ tới việc sử dụng tham chiếu. Bên cạnh đó, bạn cũng có thể sử dụng con trỏ trong trường hợp này, bạn có thể tham khảo các bài viết về con trỏ sau đó.

So sánh tham chiếu và con trỏ

Mặc dù, giữa con trỏ và tham chiếu có điểm tương đồng, tuy nhiên, giữa chúng cũng có một số điểm khác biệt cơ bản về mặt ý nghĩa như sau:

  • Một con trỏ có thể nhận giá trị null trong khi một tham chiếu thì không thể.
  • Một con trỏ có thể khởi tạo bất cứ lúc nào, trong khi một tham chiếu phải được khởi tạo ngay khi nó được khai báo. Nói cách khác, câu lệnh sau trình biên dịch sẽ báo lỗi: int &k;    // error
  • Một con trỏ có thể trỏ đến nhiều đối tượng, trong khi một tham chiếu chỉ được tham chiếu tới một đối tượng duy nhất.

Lời kết

Hi vọng qua bài viết này, sẽ cung cấp thêm cho các bạn mảng kiến thức về tham chiếu. Từ đó, có thể vận dụng linh hoạt và hiệu quả tham chiếu trong công việc. Do giữa tham chiếu và con trỏ có mối liên hệ mật thiết với nhau và trong phạm vi bài viết tôi không đề cập hết được mọi vấn đề một cách chi tiết, vì thế, các bạn hãy tham khảo các bài viết khác về con trỏ để hiểu sâu hơn về hai loại biến này.

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG