Trình tạo bản sao được xác định rõ ràng không gọi hàm tạo bản sao cho các thành viên.
Khi bạn nhập nội dung của một hàm tạo, mọi thành viên của lớp đó sẽ được khởi tạo. Tức là, khi bạn truy cập vào {
, bạn được đảm bảo rằng tất cả các thành viên của bạn đã được khởi tạo.
Trừ khi được chỉ định, các thành viên được khởi tạo mặc định theo thứ tự chúng xuất hiện trong lớp học. (Và nếu chúng không thể được, chương trình là không đúng định dạng.) Vì vậy, nếu bạn xác định constructor sao chép của riêng bạn, nó bây giờ tùy thuộc vào bạn để gọi bất kỳ thành viên sao chép bản sao như mong muốn.
Dưới đây là một chương trình nhỏ, bạn có thể sao chép-dán ở đâu đó và lộn xộn xung quanh với:
#include <iostream>
class Foo {
public:
Foo() {
std::cout << "In Foo::Foo()" << std::endl;
}
Foo(const Foo& rhs) {
std::cout << "In Foo::Foo(const Foo&)" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "In Bar::Bar()" << std::endl;
}
Bar(const Bar& rhs) {
std::cout << "In Bar::Bar(const Bar&)" << std::endl;
}
};
class Baz {
public:
Foo foo;
Bar bar;
Baz() {
std::cout << "In Baz::Baz()" << std::endl;
}
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
};
int main() {
Baz baz1;
std::cout << "Copying..." << std::endl;
Baz baz2(baz1);
}
Như-là, bản in này:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
Lưu ý rằng nó mặc định khởi tạo các thành viên của Baz
.
By ý kiến ra constructor sao chép rõ ràng, như:
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
Đầu ra sẽ trở thành này:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
Nó gọi là sao chép constructor trên cả hai.
Và nếu chúng ta giới thiệu lại Baz
's copy constructor và sao chép một cách rõ ràng một thành viên duy nhất:
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
Chúng tôi nhận được:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
Như bạn thấy, một khi bạn tuyên bố một cách rõ ràng sao chép constructor bạn chịu trách nhiệm sao chép tất cả thành viên của lớp; đó là nhà xây dựng của bạn bây giờ.
Điều này áp dụng cho tất cả các nhà thầu, bao gồm cả các nhà thầu di chuyển.
Xem: http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –