C http www ilit co kr cx 8537naver

  • Slides: 21
Download presentation
[이것이 C++ 이다] http: //www. ilit. co. kr cx 8537@naver. com 최호성

[이것이 C++ 이다] http: //www. ilit. co. kr cx 8537@naver. com 최호성

복사 생성자 객체의 복사본을 생성(혹은 선언 및 정의)할 때 호출되는 생성자. class-name(const class-name &rhs);

복사 생성자 객체의 복사본을 생성(혹은 선언 및 정의)할 때 호출되는 생성자. class-name(const class-name &rhs); class CMy. Data { public: . . . // 복사 생성자 선언 및 정의 CMy. Data(const CMy. Data &rhs) // : m_n. Data(rhs. m_n. Data) { this->m_n. Data = rhs. m_n. Data; . . . }; int _tmain(int argc, _TCHAR* argv[]) {. . . // 복사 생성자가 호출되는 경우 CMy. Data b(a); cout << b. Get. Data() << endl; . . . }

함수 호출과 복사 생성자 이 코드 등장하는 CTest 클래스 인스턴스는 모두 몇 개 인가?

함수 호출과 복사 생성자 이 코드 등장하는 CTest 클래스 인스턴스는 모두 몇 개 인가? CTest. Func 1() {. . . } void Test. Func(CTest param) { } void _tmain(int argc, _TCHAR* argv[]) { CTest a; Test. Func(a); }

변환 생성자 매개변수가 한 개인 생성자이다. 이 코드는 형식인수와 실인수 형식이 다름에도 컴파일 오류가

변환 생성자 매개변수가 한 개인 생성자이다. 이 코드는 형식인수와 실인수 형식이 다름에도 컴파일 오류가 발생하지 않는다. class CTest. Data { public: CTest. Data(int n. Param) : m_n. Data(n. Param) { cout << "CTest. Data(int)" << endl; }. . . }; void Test. Func(CTest. Data param) { cout << "Test. Func(): " << param. Get. Data() << endl; } int _tmain(int argc, _TCHAR* argv[]) { Test. Func(5); return 0; }

변환 생성자 매개변수가 한 개인 생성자이다. 이 코드에 등장하는 CTest. Data 클래스의 인스턴스 수는?

변환 생성자 매개변수가 한 개인 생성자이다. 이 코드에 등장하는 CTest. Data 클래스의 인스턴스 수는? class CTest. Data { public: CTest. Data(int n. Param) : m_n. Data(n. Param) { cout << "CTest. Data(int)" << endl; }. . . }; void Test. Func(const CTest. Data & param) { cout << "Test. Func(): " << param. Get. Data() << endl; } int _tmain(int argc, _TCHAR* argv[]) { Test. Func(5); return 0; }

변환 생성자를 선언할 때는 반드시 explicit로 선언한다. class CTest. Data { public: explicit CTest.

변환 생성자를 선언할 때는 반드시 explicit로 선언한다. class CTest. Data { public: explicit CTest. Data(int n. Param) : m_n. Data(n. Param) { cout << "CTest. Data(int)" << endl; }. . . }; void Test. Func(const CTest. Data & param) { cout << "Test. Func(): " << param. Get. Data() << endl; } int _tmain(int argc, _TCHAR* argv[]) { Test. Func(5); return 0; }

허용되는 변환 형식을 규정하면 형식간의 호환성이 생긴다. class CTest. Data { public: explicit CTest.

허용되는 변환 형식을 규정하면 형식간의 호환성이 생긴다. class CTest. Data { public: explicit CTest. Data(int n. Param) : m_n. Data(n. Param) { } // CTest. Data 클래스는 int 자료형식으로 변환될 수 있다! operator int(void) { return m_n. Data; } int Get. Data() const { return m_n. Data; } void Set. Data(int n. Param) { m_n. Data = n. Param; } private: int m_n. Data = 0; }; int _tmain(int argc, _TCHAR* argv[]) { cout << a << endl; return 0; }

r-value 참조 int &&n. Data = 3 + 7; 처럼 (연산의) 임시 결과에 대한

r-value 참조 int &&n. Data = 3 + 7; 처럼 (연산의) 임시 결과에 대한 참조자 선언이다. void Test. Func(int &&r. Param) { cout << "Test. Func(int &&)" << endl; } int _tmain(int argc, _TCHAR* argv[]) { // 3 + 4 연산 결과는 r-value이다. 절대로 l-value가 될 수 없다. Test. Func(3 return 0; } + 4);

이동 시맨틱 복사 생성자와 대입 연산자에 r-value 참조를 조합해서 새로운 생성(이동 생성자) 경우를 만들어

이동 시맨틱 복사 생성자와 대입 연산자에 r-value 참조를 조합해서 새로운 생성(이동 생성자) 경우를 만들어 낸 것이다. 생성자 및 대입(이동 대입 연산자)의 연산자 class CTest. Data { public: CTest. Data() { cout << "CTest. Data()" << endl; } ~CTest. Data() { cout << "~CTest. Data()" << endl; } CTest. Data(const CTest. Data &rhs) : m_n. Data(rhs. m_n. Data) { cout << "CTest. Data(const CTest. Data &)" << endl; } // 이동 생성자 CTest. Data(CTest. Data &&rhs) : m_n. Data(rhs. m_n. Data) { cout << "CTest. Data(const CTest. Data &&)" << endl; } int Get. Data() const { return m_n. Data; } void Set. Data(int n. Param) { m_n. Data = n. Param; } private: int m_n. Data = 0; };

이동 시맨틱 Test. Func() 함수가 반환한 임시 객체에 대한 이동 생성자가 호출된다. 곧 사라질

이동 시맨틱 Test. Func() 함수가 반환한 임시 객체에 대한 이동 생성자가 호출된다. 곧 사라질 임시 객체에 대해 얕은 복사를 수행하여 성능을 높이는 것이 핵심이다. CTest. Data Test. Func(int n. Param) { cout << "**Test. Func(): Begin***" << endl; CTest. Data a; a. Set. Data(n. Param); cout << "**Test. Func(): End*****" << endl; return a; } int _tmain(int argc, _TCHAR* argv[]) { CTest. Data b; cout << "*Before********" << endl; b = Test. Func(20); cout << "*After********" << endl; CTest. Data c(b); return 0; }