내가 누락 된 부분은 assignment
과 initialization
의 차이라고 생각합니다.
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
}
할당 연산자가 무엇을해야합니까? 객체는 생성자를 통해서만 초기화 할 수 있습니다. 대입 연산자가 호출되면 이는 이미 객체 인스턴스가 있기 때문입니다. – ildjarn
@ildjarn 솔직히 이니셜 라이저 목록을 처음 접했습니다. 내 이론적 근거는 생성자의 본문 (할당)에서'm_myString = myString; '을 대체 할 것이기 때문에 초기화 자 목록에 정렬 *이 할당되어 있다는 것입니다. – MPelletier
왜냐하면 생성자 초기화 목록에서'm_myString (myString)'을 생략하면 암시 적으로'm_myString()'이 될 것이기 때문입니다 (왜냐하면'std :: string'는 간단한 생성자를 가지고 있기 때문에). 디폴트 생성 객체. : -] – ildjarn