1

할당 연산자의 오버로드가 초기화 프로그램 목록에 전파됩니까?초기화 목록 및 할당 오버로드 (operator =)

class MyClass { 
    private: 
     std::string m_myString; //std::string overloads operator = 
    public: 
     MyClass(std::string myString); 
} 

그리고 생성자 :

MyClass::MyClass(std::string myString) 
: m_myString(myString) 
{ 
} 

는 초기화 목록 std::string에 할당 연산자 오버로드를 작동합니까 예를 들어

, 클래스를 생각? 그렇지 않은 경우 해결 방법이 있습니까?

특히 GCC의 경우.

+3

할당 연산자가 무엇을해야합니까? 객체는 생성자를 통해서만 초기화 할 수 있습니다. 대입 연산자가 호출되면 이는 이미 객체 인스턴스가 있기 때문입니다. – ildjarn

+0

@ildjarn 솔직히 이니셜 라이저 목록을 처음 접했습니다. 내 이론적 근거는 생성자의 본문 (할당)에서'm_myString = myString; '을 대체 할 것이기 때문에 초기화 자 목록에 정렬 ​​*이 할당되어 있다는 것입니다. – MPelletier

+0

왜냐하면 생성자 초기화 목록에서'm_myString (myString)'을 생략하면 암시 적으로'm_myString()'이 될 것이기 때문입니다 (왜냐하면'std :: string'는 간단한 생성자를 가지고 있기 때문에). 디폴트 생성 객체. : -] – ildjarn

답변

2

내가 누락 된 부분은 assignmentinitialization의 차이라고 생각합니다.

int a = 10; // Initialization 
a = 1; // Assignment 

위의 예는 간단하고 이해하기 어려운되지 않습니다 :

는 기본적인 유형 간단한 예를 살펴 수 있습니다. 그러나 사용자가 정의한 형식을 사용하면 개체가 으로 생성되므로 간단하지 않습니다.

예를 들어, 여기서 중요한 것은 operator= 다른 상황에서 다른 것들을 의미입니다 std::string

std::string s1("String1"); // Initialization (constructs s1 using constructor) 
std::string s2 = s1; // Initialization (constructs s2 using copy constructor) 
std::string s3(s2); // Initialization (constructs s3 using copy constructor) 

s1 = s2; // Assigns s2 to s1 using assignment operator 

볼 수 있습니다. 그것은 모두 왼편에있는에 달려 있습니다.

std::string s1 = "Hello"; // Lhs has std::string s1, so this is initialization 
    s1 = "Bob"; // Lhs has only s1, so this is assignment 

그리고 초기화 목록은 초기화 만 (따라서 이름 초기화 목록)를 않습니다. 생성자의 본문에 operator= 전화, 당신은 지금 할당을하고있는 및 초기화하지 않을 경우

MyClass::MyClass(std::string myString) 
: m_myString(myString) // Initialization 
{ 
} 

다만,주의해야합니다. 여기에 두 개의 사본이

MyClass::MyClass(std::string myString) 
{ 
    // m_myString(myString); <-- Error: trying to call like a function 
    m_myString = myString; // Okay, but this is assignment not initialization 
} 
3

나는 할당 연산자보다는 복사 생성자를 사용할 것이라고 믿습니다.

2
MyClass::MyClass(std::string myString) 
: m_myString(myString) 
{ 
} 

참고 : 하나의 매개 변수 myString를 초기화하고, 하나는 멤버 m_myString를 초기화 할 수 있습니다. 너는 그걸 원하지 않아. C++ 03에서는, 당신은 const를 참조로 매개 변수를 사용합니다 :

MyClass::MyClass(const std::string& myString) 
: m_myString(myString) 
{ 
} 

을 그리고 C++ 11에, 당신은 값으로 매개 변수를 사용하고 수동 멤버로 이동합니다 :

MyClass::MyClass(std::string myString) 
: m_myString(std::move(myString)) 
{ 
}