thiếu copy ctor rồi đó. Nó như thế này:
//file .h
STRING(const STRING&);
//file .cpp
STRING::STRING(const STRING& t)
: s{new char[size(t) + 1]}
{
//copy t.s sang this->s
}
chắc do chạy debug nên nó vẫn phải copy ra object mới rồi xóa temp
, ko trả về thẳng cái temp
luôn
copy ctor giống với operator=, nhưng operator= gán khi đã có object rồi, còn copy ctor thì gán khi object chưa có gì:
STRING a = "123"; //a gọi conversion ctor nhận const char*
STRING b = a; //b gọi copy ctor vì b chưa có gì
STRING c; //c gọi default ctor
c = b; //c gọi operator= vì c đã được khởi tạo rồi
google thêm rule of three với rule of five nha, mỗi khi xài cấp phát động trong class là phải viết đủ 3/5 cái phương thức này
nếu ko viết copy ctor thì C++ nó sẽ viết dùm bạn, và nó xài shallow copy, nghĩa là nó chỉ copy đơn giản thế này: this->s = t.s;
, rất “nông cạn” (shallow). Dẫn tới sau đó khi t.s
bị xóa thì this->s
cũng bị xóa theo. Bạn phải viết thêm copy ctor để deep copy ra mảng mới cho this->s