STDIO
Tìm kiếm gần đây

    Nội dung

    Kiểu Tham Chiếu - Reference

    15/08/2015
    19/12/2017
    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.

    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ài viết liên quan

    Các Phương Pháp Truyền Tham Số

    Để tiếp tục cho chuỗi bài viết thuộc chương trình tự học ngôn ngữ lập trình C++, bài viết hôm tôi xin phép chia sẻ các cách truyền tham số cho một hàm trong C++. Cụ thể ...

    Ryan Lê27/01/2015

    Phân Biệt Tham Chiếu Và Con Trỏ Trong C++

    Một trong những nỗi đau nhức nhói khá lớn cho những người mới bắt đầu với C++ đó là khó phân biệt được khái niệm tham chiếu và con trỏ. Trong bài viết này, tôi sẽ diễn ...

    La Kiến Vinh17/09/2014

    Rvalue References Và Move Semantics

    Vì đây sẽ là một khái niệm khó hiểu đối với những người chưa biết về nó. Do đó, bài viết không đưa ra khái niệm “Move semantics” ngay mà sẽ đi sơ lượt qua các khái niệm ...

    Hoàng Tiến Đạt02/12/2014

    Mảng Nhiều Chiều

    Mảng nhiều chiều cũng chứa nhiều phần tử, mỗi phần tử lại là một mảng một chiều, các mảng một chiều này có kích thước bằng nhau. Bài viết sẽ hướng dẫn cách khai báo, khởi ...

    Phi Phạm27/04/2015

    Chuyển Kiểu Trong Java

    Chuyển kiểu là một trong những phạm trù cơ bản cần biết khi tìm hiểu bất cứ ngôn ngữ lập trình nào. Đối với ngôn ngữ lập trình Java, chuyển kiểu được thực hiện như thế ...

    Trương Diễm Hương17/08/2015

    Tìm Hiểu Về Kiểu Numbers Trong Python

    Trong bài viết Biến Và Kiểu Dữ Liệu lần trước tôi đã giới thiệu một số kiểu dữ liệu chuẩn trong Python. Tiếp tục cho chuỗi bài viết về chương trình hướng dẫn ngôn ngữ ...

    Ryan Lê20/03/2015

    Ngôn Ngữ C++ - Lịch Sử Hình Thành Và Phát Triển

    C++ là một ngôn ngữ lập trình đa dụng – ta có thể dùng C++ để lập trình cho các hệ thống lớn, lập trình hệ điều hành cho đến các ứng dụng, game hay thậm chí ta có thể ...

    Vũ Quang Huy27/09/2014

    Tìm Hiểu Về Lists Trong Python

    Trong bài viết Biến Và Kiểu Dữ Liệu lần trước tôi đã giới thiệu một số kiểu dữ liệu chuẩn trong Python. Tiếp tục cho chuỗi bài viết về chương trình hướng dẫn ngôn ngữ ...

    Ryan Lê25/03/2015

    Biến Và Kiểu Dữ Liệu Cơ Bản Trong Java

    Bài viết cung cấp kiến thức về biến, cũng như các kiểu dữ liệu trong Java.

    Lê Minh Trung11/05/2015

    Làm Quen Với SQL Server

    Database là nơi tạo, cập nhật và lưu trữ các thông tin của một hệ thống. Nếu không có database, sẽ không có thế giới thông tin, không có cộng đồng mạng hay bất cứ hoạt ...

    Rye Nguyen30/07/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    [email protected]

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020