Sunday, May 17, 2020

HÀM TẠO SAO CHÉP (COPY CONTSTRUCTOR)

1. HÀM TẠO SAO CHÉP MẶC ĐỊNH.
   Giả sử đã định nghĩa một lớp PS (phân số):
class PS
{
private:
int tu;
int mau;
public:
PS()
{
tu = 0;
mau = 0;
}
PS(int t, int m)
{
tu = t;
mau = m;
}
};
    Ta có thể dùng câu lệnh khia báo để tạo một đối tượng từ một đối tượng mới
PS x(1, 2);
     Ta cũng có thể dùng lệnh khai báo để tạo một đối tượng mới từ đối tượng đã tồn tại.
PS y(x);
   Khi đó hàm này sẽ được sao chéo nội dung theo từng bit của x tới vùng nhớ của y. ==> Vùng nhớ của x và y có cũng giá trị. ==> các thuộc tính và phương thức của x và y đều có giá trị như nhau.

#include <stdio.h>
class PS
{
public:
int tu;
int mau;

PS(int t, int m)
{
tu = t;
mau = m;
}
};
void main()
{
PS x(1, 2);
PS y(x);
printf("X: tu = %d, mau = %d\r\n", x.tu, x.mau);
printf("Y: tu = %d, mau = %d\r\n", y.tu, y.mau);
y.tu = 2; y.mau = 3;
printf("X: tu = %d, mau = %d\r\n", x.tu, x.mau);
printf("Y: tu = %d, mau = %d\r\n", y.tu, y.mau);
}

khi chạy chương trình ta được kết quả:
X: tu = 1, mau = 2
Y: tu = 1, mau = 2
X: tu = 1, mau = 2
Y: tu = 2, mau = 3
*** nhận xét: Khi ban đầu khởi tạo thì giá trị tử mẫu của y bằng x (vì y được tạo ra từ x). Nhưng khi ta thay đổi giá trị tử mẫu của y, thì không làm thay đổi giá trị của x. Vì  lúc này x.tu, x.mau và y.tu, y.mau ở 2 vùng nhớ khác nhau.

Ta tiếp tục xét ví dụ ở class PS được xây dựng như sao.
#include <stdio.h>
#include <malloc.h>
class PS
{
public:
int *tu;
int *mau;
PS(int t, int m)
{
tu = (int*)malloc(4);
mau = (int*)malloc(4);
*tu = t;
*mau = m;
}
};
void main()
{
PS x(1, 2);
PS y(x);
printf("X: tu = %d, mau = %d\r\n", *x.tu, *x.mau);
printf("Y: tu = %d, mau = %d\r\n", *y.tu, *y.mau);
*y.tu = 2; *y.mau = 3;
printf("X: tu = %d, mau = %d\r\n", *x.tu, *x.mau);
printf("Y: tu = %d, mau = %d\r\n", *y.tu, *y.mau);
}
 Ta nhận được kết quả:
X: tu = 1, mau = 2
Y: tu = 1, mau = 2
X: tu = 2, mau = 3
Y: tu = 2, mau = 3
*** Nhận xét: 
          Khi ban đầu khởi tạo thì giá trị tử mẫu của y bằng x (vì y được tạo ra từ x). Khi ta thay đổi giá trị tử mẫu của y, thì giá trị tử mẫu của x cũng thay đổi theo. Vì  lúc này x.tu, x.mau và y.tu, y.mau là những con trỏ( một biến chứa địa chỉ) và điều trỏ tới một địa chỉ giống nhau.
==> Vì thế trường hợp cần sao chép giá trị của các biến con trỏ thì người ta cần phải xây dụng hàm tạo sao chép (copy constructor) mới chứ không dùng hàm mặc định của C++

No comments:

Post a Comment