Hướng dẫn shallow copy và deep copy c++ - bản sao cạn và bản sao sâu c ++

Nói chung, việc tạo một bản sao của một đối tượng có nghĩa là để tạo một bản sao chính xác của đối tượng có cùng giá trị, kiểu dữ liệu và tài nguyên.

Show
  • Sao chép hàm tạo
  • Toán tử gán mặc định

// Sao chép ConstructorGorsks obj1 (obj); orgeek obj1 = obj;
Geeks Obj1(Obj);
or
Geeks Obj1 = Obj;

// Các nhà điều hành gán mặc định obj2; obj2 = obj1;
Geeks Obj2;
Obj2 = Obj1;

Tùy thuộc vào các tài nguyên như bộ nhớ động được giữ bởi đối tượng, chúng ta cần thực hiện bản sao nông hoặc sao chép sâu để tạo bản sao của đối tượng. Nói chung, nếu các biến của một đối tượng đã được phân bổ động, thì bắt buộc phải thực hiện một bản sao sâu để tạo một bản sao của đối tượng.Shallow Copy or Deep Copy in order to create a replica of the object. In general, if the variables of an object have been dynamically allocated, then it is required to do a Deep Copy in order to create a copy of the object.

Bản sao nông:

Trong bản sao nông, một đối tượng được tạo bằng cách sao chép dữ liệu của tất cả các biến của đối tượng gốc. Điều này hoạt động tốt nếu không có biến nào của đối tượng được xác định trong phần HEAP của bộ nhớ. & NBSP; và lỗi thời gian chạy, con trỏ lủng lẳng. Vì cả hai đối tượng sẽ tham chiếu đến cùng một vị trí bộ nhớ, nên sự thay đổi được thực hiện bởi một người cũng sẽ phản ánh những thay đổi đó trong một đối tượng khác. Vì chúng tôi muốn tạo một bản sao của đối tượng, mục đích này sẽ không được lấp đầy bởi bản sao nông. & NBSP; Lưu ý: Trình biên dịch C ++ hoàn toàn tạo ra một hàm tạo sao chép và toán tử quá tải để thực hiện bản sao nông vào thời điểm biên dịch. & NBSP;
This will create ambiguity and run-time errors, dangling pointer. Since both objects will reference to the same memory location, then change made by one will reflect those change in another object as well. Since we wanted to create a replica of the object, this purpose will not be filled by Shallow copy. 
Note: C++ compiler implicitly creates a copy constructor and overloads assignment operator in order to perform shallow copy at compile time.
 

Hướng dẫn shallow copy và deep copy c++ - bản sao cạn và bản sao sâu c ++

Bản sao nông của đối tượng Nếu một số biến được xác định trong bộ nhớ heap, sau đó:of object if some variables are defined in heap memory, then:

Hướng dẫn shallow copy và deep copy c++ - bản sao cạn và bản sao sâu c ++

Dưới đây là việc thực hiện phương pháp trên:

C++

#include

using namespace std;

class box {

private:

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
5

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
9:

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____22 #include 3
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 5
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 7

#include 8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 using0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

using3using4

using3using6

using3using8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0#include 2 namespace3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

using3namespace7namespace8 namespace9

std;0std;1std;2 std;3

std;0std;1std;6 std;7

std;0std;9

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

class2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 class4

using2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0class7

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0class9

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0box {1

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0box {3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0box {5

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0box {7

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0box {9

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0private1 private2

namespace0

Output:

Length = 14
 Breadth = 12
 Height = 16
 Length = 14
 Breadth = 12
 Height = 16
 Length = 14
 Breadth = 12
 Height = 16

Bản sao sâu:

Trong bản sao sâu, một đối tượng được tạo bằng cách sao chép dữ liệu của tất cả các biến và nó cũng phân bổ tài nguyên bộ nhớ tương tự có cùng giá trị cho đối tượng. Để thực hiện bản sao sâu, chúng ta cần xác định rõ ràng hàm tạo sao chép và cũng gán bộ nhớ động, nếu được yêu cầu. Ngoài ra, nó cũng được yêu cầu phân bổ bộ nhớ một cách linh hoạt cho các biến trong các hàm tạo khác.

Hướng dẫn shallow copy và deep copy c++ - bản sao cạn và bản sao sâu c ++

Dưới đây là việc thực hiện phương pháp trên:

C++

#include

using namespace std;

class box {

private:

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1:7

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
9:

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
04

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____22 #include 3
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 5
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 7

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

#include 8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 using0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0#include 2 namespace3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
27

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
29

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
31

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0#include 2 namespace3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

using3namespace7namespace8 namespace9

std;0std;1std;2 std;3

std;0std;1std;6 std;7

std;0std;9

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
56

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
60

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____22 #include 3
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 5
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 #include 7

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
67

using3

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
69

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
73

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0using2

#include 8

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 using0

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0namespace0

class2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1 class4

using2

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
86

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
88

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
90

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
92

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
94

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0private1 private2

namespace0

Output:

Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16

Bản sao sâu:

Trong bản sao sâu, một đối tượng được tạo bằng cách sao chép dữ liệu của tất cả các biến và nó cũng phân bổ tài nguyên bộ nhớ tương tự có cùng giá trị cho đối tượng. Để thực hiện bản sao sâu, chúng ta cần xác định rõ ràng hàm tạo sao chép và cũng gán bộ nhớ động, nếu được yêu cầu. Ngoài ra, nó cũng được yêu cầu phân bổ bộ nhớ một cách linh hoạt cho các biến trong các hàm tạo khác.using3
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
08
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
09
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
11
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
0____22
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
16
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
18
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
20
1.
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
21
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
1
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
23
std;0std;1std;2
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
46
2. using3
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
77
Length = 12
 Breadth = 14
 Height = 16
 Length = 12
 Breadth = 14
 Height = 16
5
Hãy cho chúng tôi xem sự khác biệt trong một dạng bảng -:
3. Trong bản sao nông, hai đối tượng không độc lậpNó sao chép tất cả các trường và tạo các bản sao của bộ nhớ được phân bổ động được chỉ ra bởi các trường
4. Nó cũng tạo ra một bản sao của các đối tượng được phân bổ độngNếu chúng ta không tạo ra bản sao sâu một cách chính đáng thì bản sao sẽ chỉ ra bản gốc, với những hậu quả tai hại.