Chúng ta đã nói rằng việc sử dụng một đối tượng như là các tham số hàm truyền theo giá trị không phải là một ý tưởng tốt và bây giờ chúng ta sẽ thêm một luận cứ mạnh mẽ để làm điều này. Chúng tôi sẽ chỉ cho bạn một khía cạnh thú vị và hơi đáng ngạc nhiên khi sử dụng các copying constructor.
Như bạn đã biết, cơ chế truyền các tham số theo giá trị giả định rằng một hàm hoạt động trên bản sao của một tham số thực. Điều này là rất rõ ràng đối với các tham số có kiểu đơn giản (như int hoặc float), nhưng nó trở nên phức tạp hơn khi tham số là một đối tượng.
Chúng ta không chỉ đơn giản tạo một bản sao của một đối tượng. Phương pháp tự động duy nhất có thể tạo ra bản sao của đối tượng là gọi đến các copying constructor và đối mặt với tất cả những lợi thế cũng như bất cập của cách tiếp cận đó.
Ví dụ sau →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> using namespace std; class Dummy { public: Dummy(int value) {} Dummy(Dummy &source) { cout << "Hi from the copy constructor!" << endl; } }; void DoSomething(Dummy ob) { cout << "I'm here!" << endl; } int main(void) { Dummy o1(123); DoSomething(o1); return 0; } |
cho thấy rằng copying constructor sẽ được gọi ra khi một đối tượng được truyền vào một hàm bằng giá trị. Chúng tôi đã đưa vào copying constructor của class Dummy một dòng code để xuất text ra màn hình cho dễ theo dõi việc copying constructor được gọi.
Và chương trình trên sẽ cho ra kết quả như sau:
1 2 |
Hi from the copy constructor! I'm here! |