Điều này hiện không an toàn, như khi bạn sao chép một thể hiện của Class
, x
sẽ tham chiếu y
của đối tượng được sao chép, chứ không phải riêng của nó y
. Bạn có thể thấy điều này bằng cách chạy đoạn mã sau:
int main()
{
Class a{};
std::vector<Class> vec;
vec.push_back(a);
//these lines print the same address
std::cout << &(a.x) << std::endl;
std::cout << &(vec[0].x) << std::endl;
}
Bạn có thể khắc phục điều này bằng cách viết riêng copy constructor và phân công chức năng của bạn để khởi tạo một cách chính xác x
:
Class (const Class& rhs) : x{y}, y{rhs.y} {}
này là an toàn, bởi vì x
và y
sẽ chỉ bị phá hủy cùng với đối tượng của bạn. Việc vô hiệu tham chiếu cho std::vector
có nghĩa là tham chiếu đến các phần tử vectơ:
Class c;
std::vector<Class> vec;
vec.push_back(c);
Class& cr = vec[0];
//other operations on vec
std::cout << c.x; //fine, that reference is internal to the class
std::cout << cr.x; //cr could have been invalidated
Tôi sẽ ngạc nhiên nếu bạn có thể đẩy nó vào vectơ và có 'x' điểm mà bạn nghĩ. –
Không được đẩy trở lại là tốt cho mỗi trường hợp 'Lớp' mới được chèn vào? Dữ liệu sẽ được sao chép vào vectơ với x trỏ đến vị trí y mới. – 0ax1
Nếu bạn lấy tham chiếu trước 'push_back()', nó sẽ không trỏ đến phần tử đó bên trong vectơ. 'push_back()' lấy một bản sao. –