본문 바로가기

2010/09

[C++] 연산자 오버로딩 - 교환법칙의 성립과 임시객체(Temporary Object) 교환 법칙? 3 + 2 라는 연산이 있다. 여기에서 피연산자 위치를 다르게 바꿔도 ( 2 + 3 ) 동일한 결과를 가져오게 하는 법칙이 바로 교환법칙이다. 우리는 연산자 오버로딩을 사용함에 있어서 이렇게 교환법칙도 성립할 수 있게 만들어야 한다. 아래의 연산자 오버로딩을 보자. #include using namespace std; class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point operator+(int val); //operator+라는 이름의 함수 }; void Point::ShowPosition() { cout 더보기
[C++] 단항 연산자 오버로딩 증가/감소 연산자 오버로딩 이전에는 사칙연산인 이항연산자 오버로딩에 대해서 알아 봤는데 이번에는 단항 연산자인 증가(++), 감소(--) 연산자 오버로딩에 대해서 알아 보자. 만약 P객체가 증가가 된다면 멤버함수와 전역함수에서는 C++의 약속에 의해 어떻게 표현 될까? 이전의 이항 연산자 오버로딩때와 마찬가지로 아래와 같이 됨을 알 수 있을 것이다. p.operator++ ( ) //멤버 operator ++(p) //전역 그럼 단항 연산자 오버로딩의 예제 소스코드를 한번 살펴보자. #include using namespace std; class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosi.. 더보기
[C++] 연산자 오버로딩 (Operator Overloading)의 두가지 방법 연산자 오버로딩(Operator Overloading)은 C++ 문법과 우리와의 약속이라고 할 수 있는데, 우리가 함수를 정의하는데 이어서 operator라는 키워드와 연산자를 붙여서 함수의 이름을 만들 경우에 (operator + 이렇게 ) 우리가 일반적인 함수를 호출 방법 말고도, 연산자만을 이용해서도 함수가 호출 되도록 해주겠다는 이야기이다. 멤버 함수에 의한 오버로딩 #include using namespace std; class Point { private: int x, y; public: Point(int _x=0, int _y=0):x(_x), y(_y){} void ShowPosition(); Point operator+(const Point& p); }; void Point::ShowPo.. 더보기
[C++] 상속의 마지막, 다중 상속(Multiple Inheritance) 다중 상속이란? #include using namespace std; class AAA{ public: void String1(){ cout 더보기
가상 함수 동작 원리와 단점 동작 원리 : 가상함수는 어떻게 동작을 할까? 객체가 생성되면 멤버 함수는 메모리의 코드영역에 올라가게 된다. 우리가 생성한 객체는 코드 영역에 있는 이 멤버함수를 공유하게 것이죠. 하지만 클래스에 한개 이상의 가상 함수가 있을 경우에는 컴파일러는 실제 호출되어야 할 함수의 위치 정보를 가지고 있는 가상 함수 테이블(Vritual Table) 이라는 것을 만들고, 클래의 객체에는 가상 함수 테이블을 위한 포인터가 멤버 변수로 추가 시킵니다. 일반적으로 가상 함수가 있는 객체는 가상 함수 테이블에 있는 함수만을 호출하는 원칙을 가지고 있다. 가상 함수의 단점 : 가상 함수를 사용해서 생기는 단점은 두가지를 들 수 있다. 첫번째로, 가상함수를 쓰면 가상함수 테이블을 만드므로 그만큼의 메모리 공간의 소모가 일.. 더보기
[C++] Virtual 소멸자 곧바로 예제부터 보자. #include using namespace std; class AAA { char* str1; public: AAA(char* _str1){ str1= new char[strlen(_str1)+1]; strcpy(str1, _str1); } ~AAA(){// virtual ~AAA() cout 더보기
[C++] 오버라이딩의 특징과 정적/동적 바인딩 (Overriding & Static / Dynamic Binding) virtual 특성의 상속 앞서 우리는 오버라이딩이란 무엇인지 알아 보았다. 그 중 virtual 이라는 키워드를 잠깐 알아 봤는데, 한가지 빼먹은 것이 있었다. 바로 오버라이딩에서의 virtual의 특징은 그것의 특성도 상속된다는 것이다. #include using namespace std; class AAA { public: virtual void fct(){ cout 더보기
[C++] 오버라이딩 (Overriding) 오버라이딩 (Overriding) : 오버라이딩(Overriding)이란 기본 클래스에 선언된 멤버와 같은 형태의 멤버를 파생 클래스에서 선언하는 것이다. 오버라이딩에 관해서 더 자세히 알아 보기 전에 오버라이딩을 재정의로 알고 있으신분들은 오버라이딩에 등장하는 특성이 재정의 인거지 오버라이딩 자체는 재정의가 아닌것을 명심하고 들어가보자. 은닉의 효과 #include using namespace std; class AAA { public: void fct(){ cout 더보기
[C++] 상속 다섯번째, 상속된 객체와 참조와의 관계 객체 레퍼런스 : 객체 레퍼런스란 객체를 참조 할 수 있는 레퍼런스로 클래스 포인터(객체 포인터)의 특성과 일치 한다. #include using namespace std; class Person { public: void Sleep(){ cout 더보기
[C++] 상속 네번째, 상속된 객체와 포인터와의 관계 (객체 포인터) 객체 포인터 : 객체 포인터란 객체를 가리킬 수 있는 포인터를 의미한다. (객체의 주소 값을 저장할 수 있는 포인터) - 예를 들어 A 클래스의 포인터는 A 객체뿐만 아니라, A클래스를 상속하는 파생 클래스 객체의 주소 값도 저장이 가능하다 다음 상속 관계를 한번 살펴 보도록 하자. is-a관계에 의해서 ScholarStd 객체는 Student 객체이자 Person 객체도 동시에 된다. ("ScholarStd 는 Person 객체이다." 이런 말도 틀린말은 아니다) 그러면 "Student 객체는 ScholarStd 객체이다" 는 성립이 안된다. is-a 관계는 아래쪽으로 성립이 안된다. 우리가 프로그램상에서 서로의 객체를 생성했다고 해보자. 아래의 예제는 is-a 관계에서 위의 그림은 소스코드로 나타낸 .. 더보기