분류 전체보기 (71) 썸네일형 리스트형 [C++] 6-1 이항연산자의 오버로드 이항연산자 오버로드 멤버 연산자 함수로 이항 연산자(+, -, *, /)를 오버로드할 때는 멤버 연산자 함수 OPERATOR#()는 가인수를 하나만 가지게 된다. 이때 연산자의 우측에 놓인 객체가 멤버 연산자 함수의 가인수로 전달되며 연산자의 좌측에 놓인 객체가 멤버 연산자 함수를 호출하게 된다. 멤버 함수를 호출하면 그 멤버 함수를 호출한 객체의 시작 주소를 가리키는 포인터 this가 자동적으로 해당 멤버 함수에 전달된다. 따라서 연산자 좌측의 객체가 포인터 this에 의해 멤버 연산자 함수에 암묵적으로 전달된다. 예제 1 #include using namespace std; class score { private: int kor; int eng; public: score() {//인수가 없는 생성자 .. [C++] 5-5 템플릿 클래스(Template class) 템플릿 클래스 템플릿 클래스는 템플릿 함수보다 더 강력한 기능을 제공한다. 템플릿 함수와 마찬가지로 템플릿 클래스의 사용법도 간단하다. 자세한 내용은 아래 예제에서 참고할 수 있다. 예제 #include using namespace std; template class test { private: T1 x; T2 y; public: test(T1 a, T2 b); void output(); }; template test ::test(T1 a, T2 b) { x = a; y = b; } template void test ::output() { cout [C++] 5-4 템플릿 함수 (Template function) 템플릿 프로그래밍을 하다 보면 매개변수와 return값의 데이터형이 다를 뿐, 함수의 내부 구조가 동일한 함수들을 사용해야 되는 경우가 발생한다. 이때에는 데이터형 별로 여러 개의 함수를 작성해야 하는 번거로움이 발생한다. C++에서 제공하는 오버로드 기능을 이용하면 서로 다른 유형의 데이터를 사용해서 비슷한 작업을 수행하는 함수들을 동일한 이름으로 정의할 수 있지만, 서로 다른 return값을 돌려주는 경우에는 함수 명을 별개의 이름으로 작성해야 한다. C++에서 이러한 문제를 해결하기 위해서 템플릿(template)기능을 제공한다. 템플릿 기능으로 return 값의 다양한 데이터형을 설정할 수 있으므로 편리하게 함수를 작성하고 관리할 수 있다. 템플릿은 함수와 클래스에 적용할 수 있다. 각각 템플릿 .. [C++] 5-3 순수 가상 함수 (Pure virtual function) 순수 가상 함수 순수 가상 함수(pure virtual function)는 부모 클래스 내부에 본체에 정의하지 않는 가상 함수이다. 자식 클래스에서 오버라이드될 것이 확실한 멤버 함수들은 부모 클래스 내부의 순수가상함수를 이용한다. 순수가상함수의 선언 방법은 아래 예제에서 참고할 수 있다. 순수 가상 함수에 0 값을 설정한 것은 컴파일러에게 부모 클래스에 순수 가상 함수가 있다는 것을 알려주기 위한 것이다. 부모 클래스에서 가상 함수가 순수 가상 함수로 선언되면, 반드시 각 자식 클래스에서는 가상 함수가 오버라이드 되어야 한다. 만일 오버라이드 도지 않으면 오류가 발생한다. 적어도 하나의 순수 가상 함수를 포함하고 있는 클래스를 추상 클래스(abstract class)라 한다. 추상 클래스를 사용해서는 .. [C++] 5-2 가상 함수(Virtual function) 가상 함수 부모 클래스 내에 정의되어 있는 멤버 함수를 가상 함수(virtual function)로 만들면 자식 클래스에서 재정의하여 사용할 수 있다. 부모 클래스의 멤버 함수를 가상 함수로 만들기 위해서는 예약어 virtual를 입력하면 된다. 부모 클래스의 가상 함수를 상속받은 자식 클래스에서는 그 가상 함수를 재정의하여 사용할 수 있다. 이때 예약어 virtual은 생략한다. 가상 함수의 재정의는 함수 오버로드(overloading)와 비슷해 보이지만 전혀 다른 개념이다. 함수의 오버로드는 매개변수의 개수와 데이터 형태가 달라야 한다. 하지만 가상 함수의 재정의해서는 매개변수의 개수와 데이터 형태 그리고 return값의 데이터 형태가 동일해야 하며, 가상 함수는 클래스의 멤버이어야 한다. 이처럼 가.. [C++] 5-1 기본 클래스 포인터 (Base class pointer) 기본 클래스 포인터 기본 클래스 포인터는 부모 클래스로부터 파생된 어떤 객체들도 가리킬 수 있다. 하지만 기본 클래스 포인터를 통해서 접근할 수 있는 파생 객체의 멤버는 부모 클래스에서 상속받은 멤버들로 제한된다. 자세한 내용은 아래 예제에서 참고할 수 있다. 이러한 문제를 해결하기 위해서 가상 함수(virtual function)가 사용된다. 가상 함수에 대한 자세한 내용은 다음 포스팅에 기재하고자 한다. 예제 #include using namespace std; class parent {//부모 클래스 정의 private: char* name; public: void set_1(char* n) { name = n; } void output_1() { cout [C++] 4-5 가상 기본 클래스 (Virtual base class) 가상 기본 클래스 Child 클래스가 여러 개의 Parent 클래스를 직접 상속받는 경우 모호한 문제가 발생할 수 있다. 예를 들어 클래스 C1과 C2가 P1에게 직접 상속을 받고, 클래스 C3가 C1과 C2를 직접 상속받는 경우가 그러하다. 그러면 C3가 P1을 두 번 상속받게 된다. 한 번은 C2을 통해서 상속되고, 또 한 번은 클래스 C2를 통해서 상속된다. 이것은 클래스 C3 객체가 생성될 때 클래스 P1의 복사본이 두 개 존재하게 되는 것을 의미한다. C++에서는 어떤 Child 클래스가 동일한 Parent 클래스를 간접적으로 두 번 이상 상속받을 때 오직 한 번만 상속받도록 가상 기본 클래스 (virtual base class) 기능을 제공한다. 가상 클래스 기능을 사용하려면 parent 클래.. [C++] 4-4 클래스 다중 상속 다중 상속 Child 클래스는 2개 이상의 parent 클래스로부터 상속받을 수 있다. 이를 다중 상속이라고 하며, 사용방법은 2가지가 있다. 아래 예제에서 자세한 사용 방법을 참고할 수 있다. 예제 1 #include using namespace std; class P1 {//부모 클래스 private: char* name; public: P1(char* n) {//생성자 name = n; } char* output() { return name; } }; class C1 : public P1 {//P1의 자식 클래스 private: int age; public: C1(char* n, int a) : P1(n) {//생성자, P1에 인수 n 전달 age = a; } int output_1() { retu.. [C++] 4-3 부모 클래스의 생성자 매개변수 전달 부모 클래스의 생성자 매개변수 Object가 생성될 때 생성자 함수에 매개변수를 전달하여 클래스의 데이터 멤버들을 초기화할 수 있다. 자식 클래스의 object가 생성될 때 부모 클래스와 자식 클래스의 생성자 함수에 매개변수를 전달할 수 있다. 그러나 부모 클래스의 생성자 함수에 매개변수를 전달하려면 이를 위한 연결고리가 형성되어 있어야 한다. 자식 클래스를 통해서 부모 클래스에 매개변수가 전달되도록 파생 클래스의 생성자 함수를 아래 예제와 같이 확장된 형식으로 선언하면 된다. 예제 #include using namespace std; class parent { private: int age; public: parent(int a) { cout [C++] 4-2 상속 클래스의 생성자와 소멸자 상속 클래스의 생성자와 소멸자 Parent 클래스나 child 클래스는 모두 생성자 함수 또는 소멸자 함수를 멤버로 가질 수 있다. Parent 클래스와 child 클래스가 모두 생성자 함수와 소멸자 함수를 갖고 있는 경우에 생성자는 파생된 순서에 따라 호출되고, 소멸자는 파생된 역순으로 호출되어 실행된다. 즉, child class의 객체가 생성되면, 먼저 parent 클래스의 생성자 함수가 호출되고 child 클래스의 생성자 함수가 호출되어 실행된다. 반대로 생성된 child class 객체가 소멸되면, child class의 소멸자가 호출되고 parent class의 소멸자가 호출되어 실행된다. 예제 #include using namespace std; class parent {// Parent c.. 이전 1 2 3 4 5 6 ··· 8 다음