2011-04-08 8 views
0

나는 다음과 같이 클래스가 정의되어 :C++ 암시 적 복사 생성자와 할당 연산자

#include <iostream> 

using namespace std; 

class Point 
{ 
    int x, y; 

public: 

    Point(int a, int b) : x(a), y(b) 
    { 
     std::cout << "Constructing point (" << a << ", " << b << ") " 
       << std::endl; 
    } 

    Point(const Point& p) : x(p.x), y(p.y) 
    { 
     std::cout << "In copy constructor " << p.x << " " << p.y 
       << std::endl; 
    } 

    Point& operator=(const Point& p) 
    { 
     std::cout << "In assignment operator " << p.x << " " << p.y 
       << std::endl; 
     x = p.x; 
     y = p.y; 
     return *this; 
    } 
}; 

int main() 
{ 
    Point p1 = Point(1, 2); 

    return 0; 
} 

을 지금은이 Constructing point (1, 2) 내가 볼 전부입니다 실행할 때. 나는 컴파일러가 여기에 최적화를하고 있다고 가정하고있다. 이론상 임시가 생성 된 다음 p1을 초기화하기 위해 대입 연산자가 호출되는 것이 맞습니까?

답변

2

아니오, = 연산자가 실제로 생성자를 호출하는 것을 의미하는 선언에서 컴파일러는 가능한 모든 복사본 구성을 최적화로 생략했습니다. 선언에서 =은 할당이 호출되지 않습니다. 그래서 이론적으로는 임시가 만들어지고 복사가 이루어져 p1이됩니다. 당신이라는 연산자를 = 참조하십시오

+0

확인이 말이 - 나는 포인트 P2 = P1'시도;'와 그것뿐만 아니라 복사 생성자라고, 그래서 나는 마크로부터 완전히 벗어나지 않았습니다, 환호! –

1

,이 같은 코드를 작성해야합니다

Point p1(5, 5); 
Point p2(0, 0); //You don't have a default constructor. 

p2 = p1; // Now operator = is called.