Chúng ta có phải xác định rõ ràng một hàm tạo mặc định khi chúng ta định nghĩa một hàm tạo bản sao cho một lớp không ?? Vui lòng đưa ra lý do.Sao chép Constructor và hàm tạo mặc định
ví dụ:
class A
{
int i;
public:
A(A& a)
{
i = a.i; //Ok this is corrected....
}
A() { } //Is this required if we write the above copy constructor??
};
Ngoài ra, nếu chúng ta định nghĩa bất kỳ constructor tham số khác cho một lớp khác với constructor sao chép, sao chúng ta cũng phải xác định các nhà xây dựng mặc định ?? Hãy xem xét mã ở trên mà không có hàm tạo bản sao và thay thế nó bằng
A(int z)
{
z.i = 10;
}
Alrite .... Sau khi xem câu trả lời tôi đã viết chương trình sau đây.
#include <iostream>
using namespace std;
class X
{
int i;
public:
//X();
X(int ii);
void print();
};
//X::X() { }
X::X(int ii)
{
i = ii;
}
void X::print()
{
cout<<"i = "<<i<<endl;
}
int main(void)
{
X x(10);
//X x1;
x.print();
//x1.print();
}
ANd chương trình này có vẻ hoạt động tốt mà không có hàm tạo mặc định. Xin giải thích tại sao lại là trường hợp này ?? Tôi thực sự bối rối với khái niệm này .....
Tôi đang bối rối. Mặc dù câu trả lời dưới đây là chính xác, nhưng đó không phải là một hàm tạo bản sao. Bạn đang sao chép 'i', chính xác là ở đâu? Bạn đang sửa đổi phía bên tay phải, thường là điều sai trái. Bạn nên làm 'A (const A & rhs): i (rhs.i) {}', đó là sao chép phần bên phải 'i' vào trường hợp này của 'i'. Lưu ý các tham số được truyền theo hằng số, bởi vì khi bạn nói một cái gì đó như x = 3, 3 không nên thay đổi. Ngoài ra, thông thường các loại số được chuyển theo giá trị, không phải tham chiếu, bởi vì tham chiếu có thể chậm hơn đối với các loại dữ liệu nhỏ. – GManNickG
Wow .... Cảm ơn bạn đã bình luận ... nó xóa bỏ sự nhầm lẫn về phần ": i (rhs.i)" của nhà xây dựng đã gây nhầm lẫn cho tôi kể từ khi tôi bắt đầu nghiên cứu các nhà thầu sáng nay .... –
chương trình mới nhất không sử dụng hàm tạo mặc định ở bất kỳ đâu. Vì lý do này, bạn không cần phải xác định nó. Đó là tất cả để có nó. – AnT