''연산자 오버로딩을 발동합니다'' ''템플릿 은하계까지 남은 시간 : 1주'' [[TableOfContents]] = 미시Cpp = 회차 : 4회차 시간 : 11시 30분 ~ 장소 : 6층 학회실 == 참가원 == || 멘토 || 장용운 || 미시행 || ||<|2> 멘티 || 유재범 || 미시행 || || 신형철 || 미시행 || == 이번에 배울 것 == * 연산자 오버로딩 ○ 종류 ○ 선언과 정의 ○ 비 메서드적 연산자 오버로딩 * std::cout, std::cin, std::endl * []연산자 오버로딩 * 대입 연산자 오버로딩 * ★(C++11)RValue reference * ★(C++11)Move semantics ○ Move constructor ○ Move assignment operator '''실습''' * 체스 프로그램 클래스 디자인 ○ 기능 명세 ○ 구조 디자인 ○ 프로토타입 = 스터디 진행 = == 내용 == * Feature * Chess Rule * 2-Player-Played * Console UI * FIle I/O * 연산자 오버로딩 {{{ class A{ friend A& operator=; //4번 A& operator=(int n){ }//1번 A& operator=(class A&){ }//2번 }; A& operator=(int n, class A&){ }//3번 }}} * 1번 * 2항 연산의 뒷부분 피 연산자가 숫자일 경우 * 2번 * 2항 연산의 뒷부분 피 연산자가 자기 자신(같은 형식)일 경우 * 3번 * '3+a'와 같은 앞부분 피 연산자가 객체일 경우, 1번 식을 선언 함으로써 사용 * 4번 * friend를 이용해 3번의 전역 함수를 friend로 선언해 줘야 사용 가능 * 생성자(소멸자), 복사 생성자, 대입 연산자 오버라이딩 메소드는 C++가 만드므로 항상 조심해줘야 하며 항상 확인해야 한다. * ~~스테이크를 시켰더니 스테이크 제료가 나왔다. 근데 왠지 레스토랑에서 제공한 소스가 상한 것 같아 열어보니 상해 있다...랄까~~ * Rvalue * Lvalue : 값을 대입하고 쓰는 데 의미가 있어야 한다 * Rvalue : 이름이 없다. 고로 의미가 없다. * 대입연산자 좌측에 절대 올 수 없는 값 * TO(Temporary Object, 임시 객체) 또한 Rvalue * 이름이 없는 객체. 나중에 알려주세요 * 객체를 return by value 할 때, 객체를 생성하지 않고 클래스를 바로 인스턴스화 할 때 생성 * Rvalue Reference * 아 쓰기 힘들어 * Move semantics * 너도.... * 아마 임시 객체의 copy는 deep copy를 할 필요는 없는 것 같다... * 다만 임시 객체의 할당된 공간을 그냥 없애자... * 대입 연산자(인자는 Rvalue)로 발동 * operator=(A&&){} << 이렇게 받는다.<<이게 바로 이동 대입 연산자... ~~이름하야 열.파.참.~~ * 이동 생성자로도 발동 == 코드 == * 연산자 오버로딩 {{{ class Point { private: int x, y; public: Point operator+ (const Point& p); }; Point Point::operator+ (const Point& p) { //.... } // [point].operator+([otherPoint]) 식으로 함수를 호출한다고 생각하면 된다. // std::cout 등에서 볼 수 있는 << 같은 것도 사실 연산자 오버로딩이라고 합니다. }}} * 비메서드적 연산자 오버로딩 {{{ class Point { private: int x, y; public: friend Point operator+ (const Point& p1, const Point& p2); }; Point operator+(const const Point& p1, const Point& p2) { // .... } // 이 때, operator+ 함수가 전역 함수임에 유의하자. // friend가 그나마 유용한 희귀 케이스. // p1 + p2는 operator+(p1, p2)로 해석된다. }}} * 인덱싱 오버로딩 {{{ class String { private: char * content; public: char& operator[] (int index); }; // 함수 구현 방법은 같다. // 대입 연산자 오버로딩도 마찬가지! }}} * Rvalue Reference {{{ void main(void) { int&& rRef = (4 + 5); } // rValue를 참조함. 위 문장이 지나갈 때 (4 + 5)가 스택에서 사라짐에 주목. }}} * Move semantics {{{ class Test { public: Test(Test&& rhs); }; // 문법적인 부분. }}} = 잡담 = * 이 친구의 필기 실력을 따라 잡을 수 없다.... ~~(이 친구의 실력을 따라 잡을 수 없다!!!!)~~ ---- [활동지도/2015] [미시Cpp]