2012-01-10 6 views
5
를 호출되지

가능한 중복 : Line1에서복사 생성자는

#include <iostream> 

using namespace std; 

class sample 
{ 
    private: 
     int x; 

    public: 
     sample(int a=0) : x(a) 
     { 
      cout << "default ctor invoked\n"; 
     } 

     sample(const sample& obj) 
     { 
      cout << "copy ctor invoked\n"; 
     } 

}; 

int main() 
{ 
    sample s2 = sample(20); //Line1 
    sample s3 = 20; //Line2 

    return 0; 
} 

, 첫 sample 클래스의 생성자가 호출됩니다
Why copy constructor is not called in this case?

아래의 샘플 프로그램을 고려 explicitly을 인수 20으로 사용하십시오. s2를 초기화하기 위해서 불려가는 복사 생성자

Line2에서 처음에 sample 클래스의 생성자는 우선 인수 20을 사용하여 implicitly을 호출합니다. 여기에서도 복사 생성자를 호출하여 s2를 초기화 할 것으로 예상됩니다.

두 경우 모두 복사 생성자가 호출되지 않습니까? 왜 이런 일이 일어나는 걸까요? 복사 생성자 호출에 대한 나의 이해가 잘못되었다고 생각합니다. 누군가 내가 잘못 가고있는 곳을 바로 잡을 수 있습니까?

+0

이것은 좋은 예입니다. –

+0

복사 생성자에 대한 호출은 일부 상황에서 생략 될 수 있습니다. –

+0

@ R.MartinhoFernandes : 예. 일부 상황. 그러나 s2와 s3은 어떤 식 으로든 초기화되어야합니다. 어떻게 그것을 ctor를 호출하지 않고 이루어 집니까? –

답변

8

예상됩니다. copy elision이라고합니다.

예상은 정확하지만 컴파일러가 표현식을 복사 생성자를 우회하는 동안 하나의 인스턴스를 직접 초기화하는 것으로 간주 할 수있는 C++ (성능 향상 용)로 예외를 만들었습니다.

+0

예를 들어, 컴파일러는 복사 추출을 수행할지 또는 그렇게하지 마십시오. 하지만 두 번째 줄'sample s3 = 20;'에서 컴파일러는'int '생성자를 호출해야합니다. 나는 "두 경우 모두 복사 elision * 선택 사항입니까?"라고 묻고 싶습니다. " –

+1

복사 생성자가 액세스 할 수 없거나 (즉, '비공개') 또는 삭제 된 경우 어느 쪽도 작동하지 않습니다. 따라서 직접 초기화로 취급되는 것은 아닙니다. –

+0

둘 다 복사 초기화가 필요합니다. 둘 다'sample (sample (20));'과 동일하다. copy ctor를 private로 만든 후에 컴파일하여이를 증명할 수 있습니다. copy elision은 절대로 필요하지 않습니다. 그것은 컴파일러 최적화를위한 표준에 의해 허용된다. 그것이 생략되었는지 여부는 컴파일러에 달려 있습니다. – justin

0

첫 번째 줄에서는 개체를 복사하지 않기 때문에 복사 생성자를 호출하지 않습니다. 하나의 객체를 다른 객체에 지정합니다. C++는 얕은 복사를 수행하는 default = 연산자를 제공합니다. 그리고 이것은 암시 적으로 호출됩니다. 생성자는 오른손 개체에 대해 호출되며 기본 생성자는 왼손 개체에 대해 호출됩니다. 그 후 기본 = 연산자가 호출됩니다.

2 행에서는 정의한 int 매개 변수를 사용하는 생성자를 사용합니다. 이것은 정수를 사용하고 클래스의 객체를 만들기 때문에 실제로 변환기 생성자입니다. 그게 왜 C + +를 변환기 생성자로 사용하고 개체에 정수를 할당하려고하면 C++에서이 변환기 생성자를 비공식 적으로 호출합니다.

이 정보가 도움이되기를 바랍니다.

+0

Cemal : Line1에 대한 귀하의 설명이 정확하지 않다고 생각합니다. 내가 답변과 의견을 제공 한 다른 사람들로부터 알 수 있듯이 Line1과 Line2는 모두 복사 초기화이지만 컴파일러는 복사 생성자를 호출하지 못하도록 직접 초기화하도록 최적화합니다. –

+1

네, 맞습니다. 일반적으로 = 연산자를 사용할 때 복사 생성자를 사용하지만 질문자가 묻는 텍스트에 따라 인식하지 못했습니다. 당신이 말했듯이 내가 컴파일러 최적화에 대해 생각하지 않았고 직접 생각했다. 경고 해 주셔서 고맙습니다. –