명시 적으로 정의 된 복사본 생성자는 멤버에 대한 복사본 생성자를 호출하지 않습니다.
생성자의 본문을 입력하면 해당 클래스의 모든 멤버가 초기화됩니다. 즉, {
에 도착하면 모든 구성원이 초기화되었음을 보증하게됩니다.
지정되지 않은 한 멤버는 클래스에 나타나는 순서대로 기본 초기화됩니다. (그렇게 할 수 없다면 프로그램은 부적절합니다.) 그래서 자신 만의 복사본 생성자를 정의한다면 원하는대로 모든 멤버 복사 생성자를 호출 할 수 있습니다. 여기
는 주변에 작은 당신이 어딘가에 복사하여 붙여 넣을 수있는 프로그램 엉망 :
#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);
}
있는 그대로,이 인쇄 : 그것의 구성원을 기본-초기화 있다는
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
주 Baz
.
처럼 명시 적으로 복사 생성자을 주석으로 :
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
출력이 될 것이다 :
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
그것은 모두에서 복사 생성자를 호출합니다. 우리가 Baz
년대를 재 도입하는 경우
그리고 생성자를 복사 명시 적으로 단일 구성원 복사 :
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
을 우리는 얻을 :
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
명시 적으로 복사 생성자를 선언하면 당신이 볼 수 있듯이 은 모든 반원을 복사 할 책임이 있습니다. 지금 당신의 생성자입니다.
이것은 이동 생성자를 포함한 모든 생성자에 적용됩니다.
참조 : http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –