2011-08-28 5 views
0

편집 : 죄송합니다. 원본 게시글에 "할당 연산자"대신 "할당 생성자"를 사용했습니다. 이제 해결되었습니다.여기서 할당 연산자를 호출하지 않는 이유는 무엇입니까?

복사 생성자가 다음 코드에서 대입 연산자 대신 호출됩니다. 누구나이 이유를 알 수 있습니까? 고맙습니다.

+2

코드가 컴파일 되나요? 'operator = '(생성자가 아니기 때문에)에서 아무것도 반환하지 않습니다. – Mat

+0

g ++에서 잘 컴파일됩니다. – EXP0

+0

경고 : 'void가 아닌 함수를 반환하는 명령문이 없습니다'. '-Wall'을 사용하고 ** 많은 문제를 해결하십시오. – Mat

답변

7
A a(4); 
A b = a; 

없음 할당 1 없습니다. 둘 다 초기화입니다.

첫 번째를 직접 초기화라고하고, 두 번째를 복사 초기화라고합니다.

그들 사이의 차이는 복사 생성자를 액세스 할 수없는 경우, 그리고 두 번째 작동하지 않을 것입니다 (그 private 또는 protected 중 하나가 즉) 첫 번째는 복사 생성자에 액세스 할 수없는 경우에도 작동 할 것입니다.

두 번째 복사 생성자에 액세스 할 수 있어야한다고해도 반드시 복사 생성자가 호출되어야 함을 의미하지는 않습니다. 컴파일러는이를 최적화 할 수 있으므로 copy-constructor에 대한 호출을 모두 생략 할 수 있습니다. 의미 론적 검증을 위해서는 액세스 가능한 복사 생성자가 필요합니다.

1. 아무것도 "할당 생성자"라는 그런 일이 없다 :

다음 항목을 참조하십시오.

+1

자세한 설명을 주셔서 대단히 감사합니다. 둘 다 작동한다면 효율성면에서 차이가 있습니까? 감사. – EXP0

+0

@ EXP0 : 좋은 컴파일러는 두 가지 모두에 대해 동일한 기계 명령어를 생성합니다. 효율성 측면에서 차이가 없어야합니다. – Nawaz

4

operator=은 "할당 연산자"가 아니며 "할당 연산자"입니다.

정의에서 변수를 초기화 할 때 (A b = a처럼) 정의에 따라 복사 생성자를 호출하는 것과 같습니다. 즉 A b(a);A b = a;은 정확히 같습니다. 그 중

+2

참고 : 이것은 명시 적으로 표시되지 않은 모든 생성자에만 해당됩니다. 모든 명시 적 생성자 *는 equals 표기법과 함께 사용할 수 없습니다. 명시 적으로 구성해야합니다. –

+0

@bdonlan - C++ 표준에서 요구하는 것입니까, 아니면 일부 컴파일러에서 구현하는 최적화입니까? (예 : 복사 생성자에 대한 단일 호출로 할당 연산자 뒤에 기본 생성자를 바꾸는 것)? – AAT

+0

표준에서 필요합니다. 기본 생성자가없는 클래스에서도이 작업을 수행 할 수 있습니다. – bdonlan

관련 문제