Khi thực hiện phép gán của đối tượng nguồn h1 cho đối tượng đích h2 thì toán tử gán của class C sẽ được thực hiện và thực hiện gán các phần tử theo câu lệnh B(*this) = B::operator=(h); được gọi.
Em muốn hỏi mọi người là khi B::operator=(h) thực thi xong thì các phần tử của C kế thừa từ B được gán, tiếp theo nó ép kiểu B(*this) và gán các thuộc tính thuộc lớp B của đối tượng h cho các thuộc tính của C kế thừa từ B nữa hay sao ạ? Em có chạy thử và thấy khi tiến hành gán thì các thuộc tính của C kế thừa từ B vẫn còn trống, mọi người có thể giải thích cách hoạt động của câu lệnh đó giúp em được không ạ?
Khi em thực hiện B::operator=(h) thì thuộc tính int b; char* str; của lớp C kế thừa từ B được gán từ đối tượng h qua đối tượng con trỏ this trỏ tới và nó trả về tham chiếu của h. Sau đó nó thực hiện B(*this) = h thì có phải nó lại tiếp tục gán cho các thuộc tính int b; char* str; của lớp C kế thừa từ B đã có giá trị được gán ở bên trên hay không ạ?
Thật tiếc khi một quyển giáo trình được dùng rộng rãi lại có những đoạn code như vầy.
Tại sao lại phải dùng char* str trong khi có thể sử dụng thẳng std::string str?
Đoạn code gán B(*this) = B::operator=(h); là dư thừa. Đúng ra thì chỉ cần gọi B::operator=(h); là đủ.
PS: đoạn return h; trong copy assignment operator kia lại càng sai. Đúng ra phải là return *this; cơ
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?