3

String이라는 클래스를 정의하고 초기화를 위해 = assignment을 사용하여 String 객체를 선언했지만 그 뒤에있는 프로세스에 대해 몇 가지 질문이 있습니다. 결과는 다음과 같다C++ + assign = initialize를 사용하여 사용자 정의 클래스 객체를 선언 할 때 프로세스는 무엇입니까?

class String{ 
public: 
    String() :str(""){ cout << "default constructor" << endl; } 
    String(int n); 
    String(const char *p); 

    String(const String &x) :str(x.str) 
    { 
     cout << "copy constructor" << endl; 
    } 
    String& operator=(const String &x) 
    { 
     str = x.str; 
     cout << "operator =" << endl; 
     return *this; 
    } 
    string getStr() const 
    { 
     return str; 
    } 
private: 
    string str; 
}; 

ostream& operator<<(ostream &o,const String &x) 
{ 
    o << x.getStr(); 
    return o; 
} 

String::String(int n) 
{ 
    stringstream ss; 
    ss << n; 
    ss >> str; 
    ss.clear(); 
    ss.str(""); 
    cout << "String(int n)" << endl; 
} 

String::String(const char *p) 
{ 
    str = *p; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    String s6; 
    s6 = 10; 
    cout << s6 << endl; 
    return 0; 
} 

:의 코드를 보자

result1

, 이것은 이해할 수있다, 먼저 기본 생성자를 호출, 다음 문자열 : 문자열 (INT의 N) 생성자를 호출 , 마지막으로 통화 복사 할당시. 결과는 다음과 같다

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    String s6=10; 
    cout << s6 << endl; 
    return 0; 
} 

: 그 다음이 같은 주요 기능을 수정 result2

은 복사 할당을 호출하지 않는 이유를 이해할 수없는

는, 그 뒤에 프로세스는이에 무엇 케이스?

+0

게시 된 코드가 컴파일되지 않습니다. 귀하의 도움에 [MCVE] (http://stackoverflow.com/help/mcve) –

답변

4

혼란스러운 과제와 초기화가 있습니다.

String s6=10;은 할당이 아니라 초기화입니다. 보다 정확하게는 copy intialization입니다. 명명 된 변수 (자동 정적 또는 스레드 로컬)이 아닌 참조 형은 T의 등호 이루어진 초기화는 다음 식 기호 선언

1). 그래서 s6

은 즉 String::String(int), 아니 할당이 여기에 해당 생성자에 의해 건설/intialized된다.

+0

를 보내 주셔서 감사합니다! – Frank

2

이것은 할당이 아니며, copy initialization입니다.

T object = other; (1) ...

T 경우 T 또는 T 유래의 클래스 타입 및 other 유형의 CV-비정규 버전 아닌가요 또는 T이 클래스 유형이 아니고 other 유형이 클래스 유형 인 경우 기타 유형을로 변환 할 수있는 사용자 정의 변환 순서(T이 클래스 유형이고 변환 함수를 사용할 수있는 경우 T에서 파생 된 유형)을 검사하고 과부하 해결을 통해 최상의 유형을 선택합니다. 은 변환 생성자가 사용 된 경우 prvalue 임시 (C++ 17까지) prvalue 표현식 (C++ 17 이후)이고 은 객체를 직접 초기화하는 데 사용됩니다. 상황 T object = other에서

T object(T(other)) (direct initialization)로 변환합니다.그러나

는 마지막 단계는 일반적으로 밖으로 최적화되어 그 변환 결과가 대상 객체에 할당 된 메모리에 직접 구성되어 있지만, 적절한 생성자 (이동 또는 사본)는 비록 접근 할 필요가있다 사용되지 않습니다. (C++ 17까지)

마지막으로 선택한 단어는 직접 초기화 중에 복사 생성자가 호출되지 않은 이유를 설명합니다.