Doing MyObject& b(a)
은 복사 생성자와 관련이 없습니다. 객체 a
에 대한 참조 인 b
을 만듭니다. 아무것도 복사되지 않습니다. b
을 a
개체의 별칭으로 생각하십시오. b
과 a
을 사용하면 동일한 객체를 참조 할 수 있습니다.
MyObject b = a;
은 복사 생성자를 사용합니다 (MyObject b(a);
처럼).
는 초기화의 두 가지 형태가 있습니다 T x = a;
복사 초기화로 알려져있다; T x(a)
및 T x{a}
은 직접 초기화으로 알려져 있습니다.
T
이 참조 유형 인 경우 어떤 유형의 초기화가 사용되는지는 중요하지 않습니다. 둘 다 같은 효과가 있습니다. 이 복사본 초기화 경우 초기화가 a
유도되면서, 직접 초기화 (MyClass b(a);
) 경우 또는
:
T
우리는 두 가지 가능성을 가지고, 클래스 타입 T
(MyClass b = a;
)과 같은 유형 또는 동일한 유형 : T
의 해당 생성자가 개체를 구성하기 위해 선택됩니다. 두 가지 예제는이 클래스 유형 초기화 프로그램 범주에 속합니다.
초기화가 복사 초기화의 다른 형식이면 모든 사용자 정의 변환 시퀀스가 고려되어 직접 초기화됩니다. 사용자 정의 변환 시퀀스는 기본적으로 단일 변환 생성자가있는 표준 변환의 모든 시퀀스입니다. c
가 Foo
클래스 타입이었고 Foo
에서 변환 생성자 MyClass
에 있었다면
, 다음 MyClass b = c;
는 MyClass b(MyClass(c));
에 해당 될 것이다.
기본적으로 소스 유형과 대상 유형이 같으면 두 형식의 초기화가 동일합니다. 변환이 필요한 경우 그렇지 않습니다. 이를 보여주는 간단한 예입니다
#include <iostream>
struct Bar { };
struct Foo
{
Foo(const Foo& f) { std::cout << "Copy" << std::endl; }
Foo(const Bar& b) { std::cout << "Convert" << std::endl; }
};
int main(int argc, const char* argv[])
{
Bar b;
Foo f1(b);
std::cout << "----" << std::endl;
Foo f2 = b;
return 0;
}
(비활성화 복사 생략)와 함께이 프로그램의 출력은 다음과 같습니다
물론
Convert
----
Convert
Copy
, 너무 initialisations 다른 종류의 많은 (목록 초기화가 , 문자 배열, 집계 등).
참조가 u는 참조에 액세스 할 때마다, 해당 스토리지를 액세스하는, 누군가 다른 사람의 스토리지에 연결되어 :
맑은 설명. 감사! – user1861088
'MyObject & b = a'는'MyObject & b (a)'와'MyObject b (a)'와'MyOjbect b = a '를 절대적으로 동일하게합니까? – user1861088
@ user1861088 복사 초기화 대 직접 초기화를 검색하지 않습니다. –