Đề XuấT, 2024

Editor Choice

Sự khác biệt giữa Trình xây dựng sao chép và Toán tử gán trong C ++

Sao chép hàm tạo và toán tử gán, là hai cách để khởi tạo một đối tượng bằng một đối tượng khác. Sự khác biệt cơ bản giữa hàm tạo sao chép và toán tử gán là hàm tạo sao chép phân bổ bộ nhớ riêng cho cả hai đối tượng, tức là đối tượng đích vừa tạo và đối tượng nguồn. Toán tử gán gán phân bổ cùng một vị trí bộ nhớ cho đối tượng đích vừa tạo cũng như đối tượng nguồn.

Hãy để chúng tôi nghiên cứu sự khác biệt giữa các nhà xây dựng sao chép và toán tử gán.

Biểu đồ so sánh

Cơ sở để so sánhSao chép xây dựngToán tử chuyển nhượng
Căn bảnCác constructor sao chép là một constructor quá tải.Toán tử gán là toán tử bitwise.
Ý nghĩaTrình xây dựng sao chép khởi tạo đối tượng mới với một đối tượng đã tồn tại.Toán tử gán gán gán giá trị của một đối tượng cho một đối tượng khác cả hai đối tượng đã tồn tại.
Cú phápclass_name (cont class_name & object_name) {
// phần thân của hàm tạo
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Gọi(1) Sao chép hàm tạo khi gọi một đối tượng mới được khởi tạo với đối tượng hiện có.
(2) Đối tượng được truyền cho hàm dưới dạng tham số không tham chiếu.
(3) Đối tượng được trả về từ hàm.
Toán tử gán chỉ được gọi khi gán đối tượng hiện có một đối tượng mới.
Cấp phát bộ nhớCả đối tượng đích và đối tượng khởi tạo đều chia sẻ các vị trí bộ nhớ khác nhau.Cả đối tượng đích và đối tượng khởi tạo đều có chung bộ nhớ được phân bổ.
Mặc địnhNếu bạn không định nghĩa bất kỳ hàm tạo sao chép nào trong chương trình, trình biên dịch C ++ sẽ cung cấp một hàm ngầm định.Nếu bạn không quá tải toán tử "=", thì một bản sao bitwise sẽ được tạo.

Định nghĩa của Copy Con Contortor

Một công cụ xây dựng bản sao của người khác là một hình thức của một nhà xây dựng quá tải . Một constructor sao chép chỉ được gọi hoặc được gọi cho mục đích khởi tạo. Một constructor sao chép khởi tạo đối tượng mới được tạo bởi một đối tượng hiện có khác. Khi một hàm tạo sao chép được sử dụng để khởi tạo đối tượng đích vừa tạo, thì cả đối tượng đích và đối tượng nguồn chia sẻ vị trí bộ nhớ khác nhau. Những thay đổi được thực hiện cho đối tượng nguồn không phản ánh trong đối tượng đích. Hình thức chung của hàm tạo sao chép là

 tên lớp_ (class_name & object_name) {. // phần thân của constructor sao chép. } // object_name đề cập đến đối tượng ở phía bên phải của khởi tạo. 

Nếu lập trình viên không tạo ra một hàm tạo sao chép trong một chương trình C ++, thì trình biên dịch sẽ cung cấp một hàm tạo sao chép. Một hàm tạo sao chép ẩn được cung cấp bởi trình biên dịch thực hiện sao chép thành viên của đối tượng nguồn. Nhưng, đôi khi bản sao thành viên không đủ, vì đối tượng có thể chứa biến con trỏ. Sao chép một biến con trỏ có nghĩa là, chúng tôi sao chép địa chỉ được lưu trong biến con trỏ, nhưng chúng tôi không muốn sao chép địa chỉ được lưu trong biến con trỏ, thay vào đó chúng tôi muốn sao chép con trỏ trỏ tới. Do đó, cần có 'nhà xây dựng sao chép' rõ ràng trong chương trình để giải quyết loại vấn đề này.

Một constructor sao chép được gọi trong ba điều kiện như sau:

  • Sao chép constructor gọi khi một đối tượng mới được khởi tạo với đối tượng hiện có.
  • Đối tượng được truyền cho một hàm dưới dạng tham số không tham chiếu.
  • Đối tượng được trả về từ hàm.

Hãy cho chúng tôi hiểu xây dựng bản sao với một ví dụ.

 bản sao lớp {int num; công khai: copy () {} // copy constructor mặc định (int a) {// khởi tạo constructor num = a; } sao chép (sao chép & c) {// Sao chép hàm tạo num = c.num; } void show () {cout << num; }}; int main () {bản sao A (200); // Đối tượng A đã tạo và khởi tạo bản sao B (A); // Sao chép hàm tạo được gọi là copy C = A; // Sao chép hàm tạo được gọi là copy D; D = A; // sao chép constructor không được gọi vì đối tượng D chưa tạo đối tượng. // nó là một hoạt động chuyển nhượng. trả về 0; } 

Trong đoạn mã trên, tôi đã tuyên bố rõ ràng một bản sao của constructor (bản sao & c). Hàm tạo sao chép này đang được gọi khi đối tượng B được khởi tạo bằng đối tượng A. Lần thứ hai được gọi khi đối tượng C đang được khởi tạo bằng đối tượng A. Khi đối tượng D được khởi tạo bằng đối tượng A, hàm tạo sao chép không được gọi vì khi D được khởi tạo nó đã tồn tại, không phải là cái mới được tạo ra. Do đó, ở đây toán tử gán được gọi.

Định nghĩa toán tử chuyển nhượng

Toán tử gán là toán tử gán của C ++. Toán tử trên = = được sử dụng để gọi toán tử gán. Nó sao chép dữ liệu trong một đối tượng giống hệt nhau sang một đối tượng khác. Toán tử gán gán một đối tượng cho một thành viên khác. Nếu bạn không quá tải toán tử gán, nó sẽ thực hiện sao chép bitwise. Do đó, bạn cần quá tải toán tử gán.

 bản sao lớp {int num; công khai: copy () {} // copy constructor mặc định (int a) {// khởi tạo constructor num = a; } void show () {cout << num; }}; int main () {bản sao A (200); // Đối tượng A đã tạo và khởi tạo bản sao B (300); // Đối tượng B được tạo và khởi tạo B = A; // toán tử gán gán gọi sao chép C; C = A; // toán tử gán được gọi return 0; } 

Trong đoạn mã trên khi objectA được gán cho đối tượng B, toán tử gán được gọi vì cả hai đối tượng đã tồn tại. Tương tự, tương tự là trường hợp khi đối tượng C được khởi tạo với đối tượng A.

Khi việc gán bitwise được thực hiện, cả hai đối tượng chia sẻ cùng một vị trí bộ nhớ và những thay đổi trong một đối tượng phản ánh trong một đối tượng khác.

Sự khác biệt chính giữa Trình xây dựng sao chép và Toán tử chuyển nhượng

  1. Một constructor sao chép là một bộ điều khiển quá tải trong đó như một toán tử gán là một toán tử bitwise.
  2. Sử dụng trình xây dựng sao chép, bạn có thể khởi tạo một đối tượng mới với một đối tượng đã tồn tại. Mặt khác, một toán tử gán gán sao chép một đối tượng sang đối tượng khác, cả hai đều đã tồn tại.
  3. Một cấu trúc sao chép được khởi tạo bất cứ khi nào một đối tượng mới được khởi tạo với một đối tượng đã tồn tại, khi một đối tượng được chuyển đến một chức năng như một tham số không điều chỉnh hoặc khi một đối tượng được trả về từ một chức năng. Mặt khác, một toán tử gán chỉ được gọi khi một đối tượng đang được gán cho một đối tượng khác.
  4. Khi một đối tượng đang được khởi tạo bằng cách sử dụng hàm tạo sao chép, đối tượng khởi tạo và đối tượng khởi tạo sẽ chia sẻ vị trí bộ nhớ khác nhau. Mặt khác, khi một đối tượng đang được khởi tạo bằng toán tử gán thì các đối tượng khởi tạo và khởi tạo sẽ chia sẻ cùng một vị trí bộ nhớ.
  5. Nếu bạn không xác định rõ ràng một hàm tạo sao chép thì trình biên dịch sẽ cung cấp một. Mặt khác, nếu bạn không làm quá tải toán tử xác nhận thì thao tác sao chép bit được thực hiện.

Phần kết luận:

Trình xây dựng sao chép là tốt nhất để sao chép một đối tượng sang đối tượng khác khi đối tượng chứa con trỏ thô.

Top