0

초기화 할 때 :복사 생성자/할당 연산자 혼란이 일의 차이는 무엇 객체

class_name object_name = something; 

내가 here를 읽은 내용에서

class_name object_name(something); 

을 모두 복사 생성자를 사용하지만 난 몰라 을 이해하고이 발생하고 암시 적 전환이 어떻게 발생하는지 이해하십시오. 어떻게 그것을 이해하기 전에 (읽기 전에) 첫 번째 임시 할당 연산자 (정의되지 않은 경우) 임시 개체를 만든 다음 복사본 생성자를 호출하여 사용하지만 그것은 잘못된 것으로 보인다. 복사 생성자를 명시 적으로 만들 때 뭔가가 class_name 형식이더라도 첫 번째 옵션은으로 실패하므로 두 옵션이 충분히 달라야합니다. 또한 첫 번째 옵션에서 복사 생성자 맨 위에 사용 된 할당 연산자 (기본 또는 사용자 정의 구현 사용) 또는 복사 생성자를 호출하는 사용자에게 친숙한 구문 형식입니까? 복사 생성자가 명시 경우

+1

이 something'이 무엇인지'에 따라 달라집니다. 이것을보십시오 [gotw] (http://www.gotw.ca/gotw/036.htm). 하지만 둘 다 대입 연산자에 대한 호출을 포함하지 않습니다. – juanchopanza

답변

1

, 첫 번째 양식은 서면에 의해 달성 될 수있다 : 즉, 명시 적으로 복사 생성자를 호출

class_name object_name = class_name(something); 

.

결국 복사 생성자가 명시적인 경우 가장 명확하지 않은 경우 첫 번째 양식을 사용하거나 (가장 번거로운 구문 분석에 유의하십시오) 추가 C++ 11 포인트는 중괄호 초기화 프로그램 구문을 사용합니다. 모호한 결코 :

class_name object_name{something}; 

또는 허브 셔터의 "거의 항상 자동으로"아이디어를 사용 :

auto object_name = class_name{something}; 

는 할당을 다른 질문에 대답하거나 복사 할당 연산자가 여기에 사용되지 않습니다하십시오.

class_name object_name; 
object_name = class_name(something); // uses class_name& operator= (class_name& other) 
+0

잘 알고 있습니다. 생성자가 명시적인 경우 첫 번째 옵션을 사용할 수없는 이유는 무엇입니까? 함수를 명시 적으로 만드는 것은 전환을 제한한다는 의미입니다. 나는 "무언가"가 올바른 유형이라는 것을 고려할 때 우리의 첫 번째 선택과 관련이있는 것을 얻지 못합니다. – Veritas

+0

들어,이 질문에 대한 답변을 참조하십시오 : http://stackoverflow.com/questions/4153527/explicit-copy-constructor-behavior-and-pratical-uses – polkadotcadaver

+0

-1 할당 연산자는 여기서 사용되지 않습니다. – jrok

1

복사 생성자와 대입 연산자는 같은 것이 아니다 : 당신이 이전에 초기화 변수에 사본을 할당하는 곳에 복사 할당 연산자가 사용됩니다. 이 예에서

Test(const Test &t) 
    { 
     std::cout<<"Copy constructor called "<<std::endl; 
    } 
    Test& operator = (const Test &t) 
    { 
     std::cout<<"Assignment operator called "<<std::endl; 
     return *this; 
    } 

    Test t1, t2; 
    t2 = t1; 
    Test t3 = t1; 

는 할당 연산자 t2 = t1 요구되고, 복사 생성자 t3 = t1 호출된다. 당신이 복사 생성자는 명시 적으로 만들 경우

,이처럼 호출 할 수 있습니다

Test t3(t1);