편집 : 죄송합니다. 원본 게시글에 "할당 연산자"대신 "할당 생성자"를 사용했습니다. 이제 해결되었습니다.여기서 할당 연산자를 호출하지 않는 이유는 무엇입니까?
복사 생성자가 다음 코드에서 대입 연산자 대신 호출됩니다. 누구나이 이유를 알 수 있습니까? 고맙습니다.
편집 : 죄송합니다. 원본 게시글에 "할당 연산자"대신 "할당 생성자"를 사용했습니다. 이제 해결되었습니다.여기서 할당 연산자를 호출하지 않는 이유는 무엇입니까?
복사 생성자가 다음 코드에서 대입 연산자 대신 호출됩니다. 누구나이 이유를 알 수 있습니까? 고맙습니다.
A a(4);
A b = a;
없음 할당 1 없습니다. 둘 다 초기화입니다.
첫 번째를 직접 초기화라고하고, 두 번째를 복사 초기화라고합니다.
그들 사이의 차이는 복사 생성자를 액세스 할 수없는 경우, 그리고 두 번째 작동하지 않을 것입니다 (그 private
또는 protected
중 하나가 즉) 첫 번째는 복사 생성자에 액세스 할 수없는 경우에도 작동 할 것입니다.
두 번째 복사 생성자에 액세스 할 수 있어야한다고해도 반드시 복사 생성자가 호출되어야 함을 의미하지는 않습니다. 컴파일러는이를 최적화 할 수 있으므로 copy-constructor에 대한 호출을 모두 생략 할 수 있습니다. 의미 론적 검증을 위해서는 액세스 가능한 복사 생성자가 필요합니다.
1. 아무것도 "할당 생성자"라는 그런 일이 없다 :
다음 항목을 참조하십시오.
operator=
은 "할당 연산자"가 아니며 "할당 연산자"입니다.
정의에서 변수를 초기화 할 때 (A b = a
처럼) 정의에 따라 복사 생성자를 호출하는 것과 같습니다. 즉 A b(a);
과 A b = a;
은 정확히 같습니다. 그 중
코드가 컴파일 되나요? 'operator = '(생성자가 아니기 때문에)에서 아무것도 반환하지 않습니다. – Mat
g ++에서 잘 컴파일됩니다. – EXP0
경고 : 'void가 아닌 함수를 반환하는 명령문이 없습니다'. '-Wall'을 사용하고 ** 많은 문제를 해결하십시오. – Mat