Tôi là một nhà phát triển C có kinh nghiệm, người mới bắt đầu với C++ và tôi phải thừa nhận rằng tôi bối rối không biết có bao nhiêu cách để tạo, duy trì và hủy các đối tượng C++. Trong C, cuộc sống rất đơn giản: phân bổ trên ngăn xếp =
sao chép, trong khi trung tâm
/miễn phí
Quản lý dữ liệu trên heap. C++ còn lâu mới đạt được điều đó, ít nhất là theo quan điểm của tôi.
Với ý nghĩ đó, đây là câu hỏi của tôi:
- tất cảCác cách để tạo đối tượng C++ là gì? Trực tiếp/sao chép các hàm tạo, bài tập, v.v. Chúng hoạt động như thế nào?
- Tất cả các cú pháp khởi tạo khác nhau liên quan đến tất cả các kiểu tạo đối tượng này là gì?
Tf = x
、Tf(x);
、T f{x};
Sự khác biệt là gì?
- Điều quan trọng nhất là,khiSao chép/gán/bất cứ thứ gì trong C++
=
Điều gì là đúng, khi nào bạn muốn sử dụng con trỏ? Ở C, tôi rất quen làm nhiều Ném con trỏ đi khắp nơi vì việc phân bổ con trỏ rẻ, nhưng việc sao chép cấu trúc ít quan trọng hơn. Ngữ nghĩa sao chép của C++ ảnh hưởng đến điều này như thế nào?
- Cuối cùng, như
chia sẻ_ptr
、yếu_ptr
Đợi đã, đây là cái gì vậy?
Xin lỗi nếu đây là một câu hỏi hơi rộng, nhưng tôi rất bối rối không biết khi nào nên sử dụng cái gì (thậm chí không đề cập đến việc tôi rất bối rối về việc quản lý bộ nhớ trong các bộ sưu tập và mới
sự nhầm lẫn của nhà điều hành), tôi cảm thấy như mọi thứ tôi biết về quản lý bộ nhớ C đều bị hỏng trong C++. Điều này đúng hay mô hình tư duy của tôi sai?
Tóm lại: Các đối tượng C++ được tạo, khởi tạo và hủy như thế nào và khi nào tôi nên sử dụng từng phương thức?
Đầu tiên, kỹ năng quản lý bộ nhớ của bạn rất hữu ích trong C++, chúng chỉ ở mức dưới cách thực hiện C++ một bậc, nhưng chúng ở đó...
Về câu hỏi của bạn, chúng hơi rộng nên tôi sẽ cố gắng nói ngắn gọn:
1) Có những cách nào để tạo ra một đối tượng C++?
Tương tự như C: chúng có thể là biến toàn cục, tự động cục bộ, tĩnh cục bộ hoặc động. Bạn có thể nhầm lẫn về hàm tạo, nhưng hãy nghĩ đơn giản rằng hàm tạo được gọi mỗi khi một đối tượng được tạo. luôn luôn. Hàm tạo nào chỉ là vấn đề tham số nào được sử dụng khi tạo đối tượng.
Phép gán không tạo ra một đối tượng mới, nó chỉ sao chép nó từ đối tượng này sang đối tượng khác, (hãy nghĩ memcpy
nhưng thông minh hơn).
2) Tất cả các cú pháp khởi tạo khác nhau liên quan đến tất cả các loại tạo đối tượng này là gì? Sự khác biệt giữa T f = x, T f(x);, T f{x};, v.v. là gì?
Tf(x)
là cách cổ điển, nó chỉ sử dụng x
Là một hàm tạo tham số tạo ra một T
đối tượng gõ.
T f{x}
là cú pháp hợp nhất C++ 11 mới ở chỗ nó có thể được sử dụng để khởi tạo các loại tổng hợp (mảng, v.v.), nhưng nếu không thì nó tương đương với cú pháp trước đây.
Tf = x
tùy thuộc vàox
Nó có thuộc về khôngT
kiểu. Nếu có thì tương đương với loại trước. Nếu là loại khác thì tương đương với.Tf = T(x)
. Điều này không thành vấn đề vì trình biên dịch được phép tối ưu hóa các bản sao bổ sung (sao chép bỏ phiếu).
T(x)
. Bạn đã quên điều này. T
Một đối tượng tạm thời thuộc loại được tạo (sử dụng cùng một hàm tạo như trên), nó được sử dụng ở bất cứ nơi nào nó xuất hiện trong mã và ở cuối biểu thức đầy đủ hiện tại , nó đã bị phá hủy.
Đúng vậy
. Điều này sẽ tạo một hàm tạo mặc định nếu có T
loại giá trị. Đây chỉ là một hàm tạo không có tham số.
T f{}
. Cấu trúc mặc định nhưng sử dụng cú pháp thống nhất mới. Xin lưu ý rằngT f()
KHÔNG T
gõ đối tượng, thay vì trả về T
! chức năng.
T()
. Đối tượng tạm thời sử dụng hàm tạo mặc định.
3) Quan trọng nhất là khi nào thì sao chép/gán/bất cứ lệnh nào = trong C++ là đúng và khi nào bạn muốn sử dụng con trỏ?
Bạn có thể sử dụng cách tiếp cận tương tự như trong C. Hãy coi việc sao chép/phân bổ như memcpy
vị trí. Bạn cũng có thể chuyển các tài liệu tham khảo, nhưng bạn cũng có thể đợi một thời gian cho đến khi bạn hài lòng với những tài liệu này. Điều bạn nên làm là: không sử dụng con trỏ làm biến cục bộ phụ trợ, thay vào đó hãy sử dụng tham chiếu.
4) Cuối cùng, tất cả những thứ như shared_ptr, weak_ptr, v.v. là gì?
Chúng là những công cụ trong vành đai công cụ C++ của bạn. Bạn sẽ phải học qua kinh nghiệm và một vài sai lầm...
chia sẻ_ptr
Được sử dụng khi quyền sở hữu một đối tượng được chia sẻ.
duy nhất_ptr
Sử dụng khi quyền sở hữu một đối tượng là duy nhất và rõ ràng.
yếu_ptr
để ngắt chia sẻ_ptr
Các vòng lặp trên cây. họsẽ khôngTự động phát hiện.
vector
. Đừng quên điều này! Hãy sử dụng nó để tạo ra các mảng động của bất kỳ thứ gì.
Tái bút: Bạn quên hỏikẻ hủy diệt. IMO, các hàm hủy tạo nên cá tính cho C++, vì vậy hãy nhớ sử dụng chúng nhiều!
Tôi là một lập trình viên xuất sắc, rất giỏi!