2011-09-21 4 views
1

에서 나는 다음과 같은 코드에 대한 질문이 있습니다.복사 생성자와 연산자 = C++

나는이 다음 코드 :

P doSomething(){ 
    P p("myValue"); 
    return p; 
} 

int main(){ 
    P m=doSomething(); 
    return 1; 
} 
  1. 왜 생성자가 doSomething() 함수의 return p에서 호출 복사되지 않는 이유는 무엇입니까?
  2. P m=doSomething() - 복사 생성자 또는 연산자 =?를 호출하는 것으로 가정합니까? 메리

    P new_val=("newVal"); 
    p m=new_val; 
    

은 (내가 여기 알고 전화는 복사 생성자)

감사합니다, : 경우에

  • IT는이 코드의 차이는 다음과 같은 어떤 연산자 =,이다

  • +0

    가능한 중복 호출됩니다 복사 반환 [왜 소멸자 한 번만 호출 된?] (http://stackoverflow.com/questions/ 6422114/왜 소멸자인가?) –

    +0

    'class P '에 정의 된 복사 생성자에 대한 코드를 게시 할 수 있습니까? – cpx

    +0

    변수의 초기화시,'='을 쓰고 있더라도 항상 복사 생성자가 사용됩니다. 귀하의 예제에서 사용되지 않는 이유는 컴파일러가 코드를 최적화했기 때문일 수 있습니다. – Shahbaz

    답변

    -2

    1) 왜 doSomething() 함수의 "return p"에서 복사 생성자가 호출되지 않습니까?

    복사기의 콘솔에 무엇인가를 인쇄하여 실제로 실행되는지 확인하십시오.

    2) 호출 P m = doSomething() - 복사 생성자 또는 연산자 =?

    은 연산자 =를 호출해야합니다. 또, 어떤 코드의 차이는 다음과 같은, 그것은 운영자 =의 경우

    3) 확인 방법 내에서 디버그 메시지의 인쇄를 사용 P 새로운 = ("된 newval"); p m = 새로운; (여기에 복사 생성자에 대한 호출이 있음을 알고 있습니다.)

    코드 스 니펫에 뭔가 빠졌습니까? 나는 그것이 컴파일되지 않을 것이라고 생각한다.

    +0

    당신이 틀렸어 ... –

    +0

    ~해야합니다. 실제로 실행 중인지 확인하기 위해 복사기의 콘솔에 무엇인가를 인쇄 해보십시오. - 아무 것도 출력하지 않습니다. – mary

    2
    • 왜 복사 생성자가 doSomething() 함수의 return p에서 호출되지 않습니까?

    표준을 사용하면이 사본을 생략 할 수 있습니다. Google [N] RVO 용 특정 컴파일러에서는 최적화 할 때만 발생합니다. 다른 컴파일러에서는 호출 규칙의 일부이므로 항상 발생합니다.

    • 호출 P m = doSomething() - 복사 생성자 또는 연산자 =?

    T t = x;T t(T(x))에 대한합니다 (T(x) 암시 적으로 일어나고 있다는 의미에서) "문법 설탕"이고, 따라서이 - operator=와는 아무 - =에도 불구하고. 추가 임시 정보가 생략 될 수도 있으므로 여기에는 복사기가 호출되지 않습니다.경우에

    • 그것이 =는이 코드의 차이는 다음과 같은 것입니다 운영자 :

    이 코드는 아무 의미가 없습니다, 당신은 정말 무엇을 의미 했습니까?

    P new=("newVal"); 
    p m=new; 
    
    +0

    Re point 2, 문법적으로 설탕이 아닙니다. 'T t = x'의 변환은 묵시적입니다 (그리고'명시 적'생성자는 고려되지 않습니다). 재 작성에서의 변환은 명백합니다. (실제로는 두 코드 모두 합법적이지만 코드는 다른 의미를 가질 수 있습니다.) –

    +0

    복사 초기화와 직접 초기화는 완전히 동등하지 않습니다. 후자는 '명시 적'복사 생성자로도 작동하지만 전자는 그렇지 않습니다. –

    +0

    @JamesKanze : 따라서 주위에 따옴표를 붙이면 답안에서 약간 지워지려고합니다. – PlasmaHH

    0

    데모 용으로 작은 샘플을 만들었습니다.

    void print(char* text, int ident) 
    { 
        for(int i = 0 ; i < ident ; i++) 
        { 
         printf(" "); 
        } // end for 
    
        fprintf(stdout, text); 
        fprintf(stdout, "\n"); 
        fflush(stdout); 
    } 
    
    class P 
    { 
    public: 
        char* _str; 
    
        P (P& arg) 
        { 
         print("copy constructor", 2); 
         arg._str = this->_str; 
        } 
    
        P (char* str) 
        { 
         print("constructor", 2); 
         _str = str; 
        } 
    }; 
    
    P doSomething(){ 
        print("do something - function", 1); 
        P p("myValue"); 
        print("before return p", 1); 
        return p; 
    } 
    
    int main(int argc, char* argv[]) 
    { 
        print("start", 0); 
        P m=doSomething(); 
        print("stop - call return", 0); 
        return 1; 
    } 
    

     
    start 
        do something - function 
         constructor 
        before return p 
         copy constructor 
    stop - call return 
    

    그래서 생성자의