2014-11-13 1 views
4

T이 C++ 클래스라고 가정하고 T a = b;을 수행하면 복사 생성자 또는 할당 연산자는 무엇입니까?C++ : "T a = b"- 복사 생성자 또는 대입 연산자?

현재 실험에서 복사 생성자가 호출되었지만 이유를 이해하지 못한다는 것을 보여줍니다.

#include <iostream> 
using namespace std; 

class T { 
public: 
    // Default constructor. 
    T() : x("Default constructor") { } 
    // Copy constructor. 
    T(const T&) : x("Copy constructor") { } 
    // Assignment operator. 
    T& operator=(const T&) { x = "Assignment operator"; } 
    string x; 
}; 

int main() { 
    T a; 
    T b = a; 
    cout << "T b = a; " << b.x << "\n"; 
    b = a; 
    cout << "b = a; " << b.x << "\n"; 
    return 0; 
} 

$ g++ test.cc 
$ ./a.out 
T b = a; Copy constructor 
b = a; Assignment operator 

고마워요!

T a = b; 

T a(b); 

그것은 초기화하지 할당의 것과 같은 효과가 있기 때문에

+2

대 =, 그러한 객체는 생성자의 따라서 사용을 존재하지 않습니다. 'b = a'에서 b라는 객체가 이미 존재하고 이전 값을 a에서 복사 한 값으로 대체 (할당)하고 있으므로 대입 연산자가 사용됩니다. – YoungJohn

+0

'하지만 왜 이해가 안되 죠. '그 행동이 달라야한다고 생각하는 이유가 있습니까? –

+0

관련 : http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization –

답변

6

는 복사 생성자가 호출된다. 길게 짧게, 그것은 단지 언어가 작동하는 방법입니다. 당신이 (건설) B라는 이름의 객체를 생성하는 A` 그래서 하나가 구축되어야하기 전에

+6

이 두 줄은 * 동일하지 않습니다. –

+1

성능면에서는별로 좋지 않지만 @PiotrS에 동의합니다. – 101010

+6

첫 번째 것은 [copy initialization] (http://en.cppreference.com/w/cpp/language/copy_initialization)입니다. 두 번째는 [직접 초기화] (http://en.cppreference.com/w/cpp/language/direct_initialization)입니다. 나는 OP가 할당 대 초기화에 대해 묻고 있다고 생각한다. –

2
... 

// The variable a does not exist before this point, therefore it is *conststructed* 
T a = b; // Copy constructor is called 

... 

T의 B '에서

... 

T a; // Default constructor is called 

// a already exists, so assignment is used here 
a = b; // assignment operator is called 

... 
관련 문제