1. Assignment Operator
Assignment Constructor dùng để thay thế data của một đối tượng đã được khởi tạo bằng data của một đối tượng khác. Hãy xem ví dụ sau →
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 |
#include <iostream> #include <string> using namespace std; class Foo { public: Foo(int data) { this->data = data; } ~Foo() {}; // Assignment Constructor Foo& operator=(const Foo& rhs) { data = rhs.data; return *this; } void printData() { cout << data << endl; } private: int data; }; int main() { Foo obj1(2); //Foo(int data) called Foo obj2(10); obj1 = obj2; // Assignment Operator Called obj1.printData(); //Prints 10 } |
Ở ví dụ này, sau khi đối tượng obj1 được khởi tạo, nó được gán bằng đối tượng obj2. Do dấu = được dùng để gán obj2 cho obj1 sau khi obj1 đã được khởi tạo rồi nên operator= sẽ được gọi.
2. Copying Operator
Khác với Assignment Constructor, Copying Constructor dùng để khởi tạo một đối tượng chưa từng được khởi tạo trước đó. Hãy xem ví du sau →
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 |
#include <iostream> #include <string> using namespace std; class Foo { public: Foo(int data) { this->data = data; } ~Foo() {}; // Copying Constructor Foo(const Foo& rhs) { data = rhs.data; } void printData() { cout << data << endl; } private: int data; }; int main() { Foo obj1(2); //Foo(int data) called Foo obj2 = obj1; // Copying Constructor obj2.printData(); // Prints 2 } |
Vì obj2 được khai báo và gán giá trị đồng thời, tức là obj2 chưa từng được khởi tạo trước khi gán bằng obj1 ⇒ Trong trường hợp này Copying Constructor sẽ được gọi.
3. Copying Constructor và Assignment Constructor
Chúng ta đã hiểu về Copying Constructor và Assignment Constructor cùng với các ví dụ riêng lẻ về chúng. Giờ hãy cùng xem kiểm chứng lại khi chúng cùng xuất hiện trong cùng 1 ví dụ →
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 37 38 39 40 41 42 43 44 45 46 |
#include <iostream> #include <string> using namespace std; class Foo { public: Foo(int data) { this->data = data; } ~Foo() {}; // Assignment Constructor Foo& operator=(const Foo& rhs) { cout << "Assignment Constructor" << endl; data = rhs.data; return *this; } // Copying Constructor Foo(const Foo& rhs) { cout << "Copying Constructor" << endl; data = rhs.data; } void printData() { cout << data << endl; } private: int data; }; int main() { Foo obj1(2); //Foo(int data) / Normal Constructor called Foo obj2 = obj1; // Copying Constructor Called obj2.printData(); // Prints 2 Foo obj3(42); obj3 = obj1; //Assignment Constructor Called obj3.printData(); // Prints 2 } |
Ở đây phép gán đầu tiên sẽ call đến Copying Constructor vì lúc đó obj2 chưa được khởi tạo, trong khi đó phép gán thứ 2 sẽ call đến Assignment Constructor vì obj3 đã được khởi tạo trước khi gán.
Output của chương trình →
1 2 3 4 |
Copying Constructor 2 Assignment Constructor 2 |
— Phạm Minh Tuấn (Shun) —
