Làm cách nào để truyền đối số cho hàm trong C++: Theo giá trị so với theo tham chiếu?

Lam Cach Nao De Truyen Doi So Cho Ham Trong C Theo Gia Tri So Voi Theo Tham Chieu



Bất kỳ ngôn ngữ lập trình nào, kể cả C++, đều phải có khả năng cung cấp tham số cho hàm. Qua giá trị và bởi thẩm quyền giải quyết là hai phương thức chính có thể được sử dụng để truyền tham số. Cả hai phương pháp đều có những lợi ích và hạn chế, vì vậy điều quan trọng đối với các lập trình viên là biết khi nào nên sử dụng từng phương pháp.

1: Truyền đối số theo giá trị

Một bản sao của biến được tạo và cung cấp cho hàm khi đối số được truyền theo giá trị . Tất cả các sửa đổi được thực hiện đối với biến bên trong hàm chỉ ảnh hưởng đến bản sao; không có gì được thay đổi thành biến ban đầu. Kết quả là, chuyển theo giá trị là một phương pháp an toàn vì không có khả năng vô tình sửa đổi giá trị của biến ban đầu.

Truyền theo giá trị tuy nhiên, có thể không hiệu quả, đặc biệt khi xử lý các loại dữ liệu lớn hoặc phức tạp. Mọi lệnh gọi hàm yêu cầu sao chép dữ liệu có thể nhanh chóng làm cạn kiệt tài nguyên bộ nhớ và CPU. Hơn nữa, chuyển theo giá trị không thể được sử dụng cho các chức năng nhằm mục đích thay đổi giá trị của biến gốc vì bản sao và biến gốc không được liên kết.







2: Truyền đối số theo tham chiếu

Các biến có thể là thông qua tham chiếu trong C++, giúp giải quyết những vấn đề này. Biến ban đầu được gửi đến hàm khi chuyển qua tham chiếu và bất kỳ sửa đổi nào được thực hiện đối với biến bên trong hàm cũng sẽ ảnh hưởng đến biến ban đầu. Vì điều này, chuyển qua tham chiếu về cơ bản hiệu quả hơn đối với các loại dữ liệu lớn hoặc phức tạp và tránh được nhu cầu sao chép.



Để ngăn chặn các sửa đổi ngoài ý muốn, một chức năng phải được chỉ định rõ ràng là const. Việc thêm từ khóa const vào phần khai báo hàm, như trong “int tính toán(const int& a, const int& b),” sẽ thực hiện được điều này.



Tuy nhiên, truyền đối số bằng tham chiếu đòi hỏi sự chú ý cẩn thận đến từng chi tiết là tốt. Các lập trình viên thiếu kinh nghiệm có thể mắc lỗi, chẳng hạn như tạo ra các tác dụng phụ không chủ ý, chia sẻ dữ liệu ngoài ý muốn và ghi đè dữ liệu bên ngoài.





Hãy xem xét đoạn mã sau thể hiện cả hai phương thức truyền đối số :

#include

sử dụng không gian tên std ;

khoảng trống PassByValue ( int x ) {

x = 5 ;

cout << 'Bên trong PassByValue:' << x << kết thúc ;

}

khoảng trống PassByReference ( int & x ) {

x = 5 ;

cout << 'Bên trong PassByReference:' << x << kết thúc ;

}

int chủ yếu ( ) {

int số1 = 2 , số2 = 2 ;

cout << 'Trước khi gọi hàm: num1=' << số1 << ' số2= ' << số2 << kết thúc ;

PassByValue ( số1 ) ;

PassByReference ( số2 ) ;

cout << 'Sau khi gọi hàm: num1=' << số1 << ' số2= ' << số2 << kết thúc ;

trở lại 0 ;

}

Trong đoạn mã trên, chức năng đầu tiên, PassByValue , nhận một đối số nguyên theo giá trị. Trong hàm, một biến số nguyên mới được tạo và gán giá trị 5. Số nguyên ban đầu không bị thay đổi. Chức năng thứ hai, PassByReference , nhận một đối số nguyên theo tham chiếu. Trong trường hợp này, hàm thao tác trực tiếp với biến ban đầu.



đầu ra

Như mong đợi, cuộc gọi đầu tiên xuất ra 5, nhưng không ảnh hưởng đến biến ban đầu. Ngược lại, lệnh gọi thứ hai thay đổi giá trị của num2 thành 5, điều này ảnh hưởng đến đầu ra của câu lệnh cuối cùng.

Truyền theo Giá trị so với Truyền theo Tham chiếu

1: Cách gọi một hàm

Một sự khác biệt giữa chuyển theo giá trị chuyển qua tham chiếu là cách chức năng được gọi. Khi chuyển theo giá trị , lệnh gọi hàm phải bao gồm giá trị của biến, chẳng hạn như `calculate(a, b)`. Khi chuyển qua tham chiếu , lệnh gọi hàm phải bao gồm địa chỉ bộ nhớ của biến, được ký hiệu bằng ký tự dấu và, chẳng hạn như `calculate(&a, &b)`.

2: Kiểu dữ liệu

Nói chung, chuyển theo giá trị thích hợp nhất khi làm việc với các kiểu dữ liệu nhỏ hoặc đơn giản, hoặc khi hàm không có ý định sửa đổi biến ban đầu. Chuyển qua tham chiếu phù hợp hơn với các loại dữ liệu lớn hoặc phức tạp hoặc khi hàm này nhằm sửa đổi giá trị của biến ban đầu.

Phần kết luận

Khi các thông số là thông qua giá trị đối với một hàm, một bản sao của biến được tạo và cung cấp. Qua chuyển qua tham chiếu , biến ban đầu được gửi đến hàm. Trong C++, truyền đối số theo giá trị hoặc theo tham chiếu là một khái niệm cơ bản. Việc lựa chọn cách tiếp cận phù hợp phụ thuộc vào hoàn cảnh cụ thể và cần được đánh giá cẩn thận. Những lợi ích của việc sử dụng các thẩm quyền giải quyết cách tiếp cận có thể dẫn đến mã hiệu quả hơn, bất chấp sự cám dỗ để sử dụng dễ dàng hơn chuyển theo giá trị phương pháp.