Bạn nên suy nghĩ của một tham chiếu như là một 'con trỏ const đến một đối tượng không const':
MyObject& ~~ MyObject * const
Bên cạnh đó, một tham chiếu chỉ có thể được xây dựng như một bí danh của một cái gì đó mà tồn tại (đó là không cần thiết cho một con trỏ, mặc dù được khuyên dùng ngoài NULL). Điều này không đảm bảo rằng đối tượng sẽ ở xung quanh (và thực sự bạn có thể có một lõi khi truy cập vào một đối tượng thông qua một tài liệu tham khảo nếu nó không còn nữa), hãy xem xét mã này:
// Falsifying a reference
MyObject& firstProblem = *((MyObject*)0);
firstProblem.do(); // undefined behavior
// Referencing something that exists no more
MyObject* anObject = new MyObject;
MyObject& secondProblem = *anObject;
delete anObject;
secondProblem.do(); // undefined behavior
Giờ đây, có hai yêu cầu cho một container STL:
- T phải constructible mặc định (một tham chiếu không phải là)
- T phải chuyển nhượng (bạn không thể thiết lập lại một tài liệu tham khảo, mặc dù bạn có thể gán cho trọng tài của nó)
Vì vậy, trong các container STL, bạn phải sử dụng proxys hoặc con trỏ.
Bây giờ, sử dụng con trỏ có thể chứng minh vấn đề đối với việc xử lý bộ nhớ, vì vậy bạn có thể phải:
con trỏ thông minh
KHÔNG sử dụng auto_ptr, có sự cố với chuyển nhượng kể từ khi nó sửa đổi toán hạng tay phải.
Hy vọng nó sẽ giúp :)
Nguồn
2009-10-09 11:40:29
Đừng nghĩ đến các tham chiếu dưới dạng con trỏ bị hạn chế. Hãy coi chúng là bí danh đối với các đối tượng hiện tại không được phép để lủng lẳng. – sbi