목록C++ (16)
코가손의 블로그
class Position { public: ... Position operator+(const Position& other) { _x = _x + other._x; _y = _y + other._y; return *this; } private: int _x; int _y; } int main() { Position p1(3, 4); Position p2(4, 5); Position val; val = p1 + p2; } p1 + p2 는 코드로 보기 편하기 위함이고 Position operator+( const Position& other)메소드로 p1.operator+(p2)라고 볼 수 있다. p1과 p2를 더한 값을 넘겨주어야 하기 때문에 return *this; 가 필요하다.
초기화 리스트를 이용하면 다음과 같은 상황에서 장점이 있다. 1. 상속 관계에서 원하는 부모의 생성자를 호출할 때 사용한다. 2. 정의와 동시에 초기화가 필요한 경우(참조 타입, cosnt) 이해를 돕기 위해 예시 코드를 한번 보도록 하자 class Player { public: Player() {} Player(int id) {} // 자식 클래스에서 원하는 생성자를 호출하고 싶다면?? } class Knight : public Player { public: Knight() /* 선처리 영역 */ { Player(1); } private: int _hp; // 초기화 안하면, 쓰레기값 들어감 } 위 코드는 초기화 리스트를 사용하지 않았다. Knight클래스 생성자에서 Player(int id)생성자를 ..
Class Vector { int x; int y; } // 스택 메모리에 올림(빠름) Vector a; // 힙 메모리에 올림(느림) Vector* b = new Vector(); new 연산자를 사용하면 Heap 메모리에 Vector객체를 동적 생성한다. Heap 영역에 있는 객체를 포인터 변수 b를 이용해 동적 생성된 Vector객체의 주소를 가리키도록 한다. + 클래스의 멤버함수는, 코드영역에 존재한다. 각 멤버함수는 컴파일 시 한번만 메모리에 할당된다.
정적 바인딩 C++은 기본적으로 정적 바인딩으로 설정되어 있다. 정적 바인딩이란 상속 관계에 있는 클래스 사이에서 발생한다. 예를 들어 Animal이란 부모 클래스를 상속받은 Dog클래스가 있다고 생각해 보자. Animal클래스 에는 Speak()라는 메소드가 있고 Dog클래스는 부모클래스를 오버라이딩 한 Speak()메소드 가 있다. Dog의 객체를 생성하고 Speak()메소드를 호출할 때 Animal클래스의 메소드가 호출될지, 아니면 Dog클래스의 메소드가 호출될까 Java의 경우 오버라이딩 된 자식 메소드가 호출된다. C++는 Dog인스턴스의 포인터에 맞게 호출된다. Java의 경우를 동적 바인딩, C++는 정적 바인딩 이라고 한다. 'Dog인스턴스의 포인터에 맞게 호출' Animal* dog1 =..