2012-02-15 34 views
7

Khi tôi muốn tạo một lớp trong C++ Tôi thường đi theo con đường nàyC con trỏ ++ và tài liệu tham khảo với từ khóa mới khi instantiating

Book bk = new Book(); 

giáo sư của tôi thời gian gần đây đã làm điều này

Book &bk = *new Book(); 

Ông chỉ nói với tôi rằng anh ta sẽ sử dụng một tham chiếu để có thể sử dụng dấu chấm (ví dụ như bk.getTitle();) toán tử thay vì mũi tên (ví dụ bk-> getTitle();). Tôi hiểu phần này của mã nhưng điều gì xảy ra khi bạn sử dụng toán tử * kết hợp với mới?

Cảm ơn trước

ví dụ mã đầy đủ có thể được tìm thấy here nó là arraystack trong hàm chính

+7

Vì vậy, giáo sư của bạn đã cho bạn thấy làm thế nào để rò rỉ bộ nhớ, tuyệt vời. – ildjarn

+2

Nếu giáo sư của bạn sử dụng mã đó cho bất cứ điều gì khác ngoài một ví dụ về một cái gì đó mà bạn thực sự thực sự không nên làm, thì bạn nên tìm một giáo sư mới. –

+0

Có lẽ giáo sư của bạn đã nói, 'const Book & bk = Book();'. Nếu đó không phải là trường hợp, tôi thành thật không hiểu những gì giáo sư của bạn có nghĩa là. – Mahesh

Trả lời

15

này:

Book &bk = *new Book(); 

là khá nhiều tương đương như sau:

Book *p = new Book(); // Pointer to new book 
Book &bk = *p; // Reference to that book 

Nhưng có một sự khác biệt quan trọng; trong mã ban đầu, bạn không có một con trỏ mà bạn có thể sử dụng để delete đối tượng được phân bổ động khi bạn đã hoàn thành nó, vì vậy bạn đã tạo ra rò rỉ bộ nhớ một cách hiệu quả.

Tất nhiên, bạn có thể làm điều này:

delete &bk; 

nhưng đó là cực kỳ phi ngữ C++, và rất có khả năng gây ra vấn đề sau.

Tóm lại, hoàn toàn không có lý do chính đáng để viết mã như thế này, vì vậy không làm điều đó. Một trong những điều sau đây là tốt:

Book bk; 
Book bk = Book(); 
+0

cảm ơn bạn Tôi nghĩ rằng tôi sẽ không sử dụng nó sau đó. Lớp học là nhiều hơn về mẫu thiết kế hơn là về c + + vì vậy tôi sẽ chỉ bỏ qua phong cách lập trình này và làm theo cách của tôi. – tim

+1

Bạn chắc chắn không tạo ra một rò rỉ bộ nhớ mặc dù, tôi nghĩ rằng đó là một cách nói quá lớn –

+0

@ Seth: Mã ban đầu thực sự có một rò rỉ ... Bạn có ý nghĩa gì? – ildjarn

0

Tôi đã tìm thấy một trường hợp cho phép tôi suy nghĩ về cú pháp đó. Hãy xem xét một con trỏ thông minh đến một lớp Base và phải giữ một con trỏ đến một lớp dẫn xuất và bạn muốn truy cập một số thứ không phải ảo của lớp dẫn xuất sau khi xây dựng. Trong trường hợp này một cái gì đó như thế này là hợp pháp và có thể không được như vậy xấu:

Derived & d = * new Derived(); 

d.d_method(..whatever..); 
d.d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(&d); 

Cuối cùng tôi vẫn ưa thích các mũi tên nhỏ để các ampersands lạ:

Derived d = new Derived(); 

d->d_method(..whatever..); 
d->d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(d); 

Nhưng tôi nghĩ rằng trong này là một trường hợp là chỉ là vấn đề về hương vị, đặc biệt là nếu bạn truy cập một số phương thức nhất quán.

Những thứ khác dẫn đến rò rỉ hoặc delete &d; chỉ tệ, xấu, xấu.

Các vấn đề liên quan