본문 바로가기

C++

순수 가상 함수와 추상 클래스 순수 가상 함수 와 추상클래스 순수 가상 함수란? 함수 오버라이딩을 한후 Base class 의 은닉된 함수를 완전히 가리기 위하여 virtual 키워드로 함수부를 완전히 가리게 된다. 하지만 함수의 바디(body) 부분을 여전히 기제를 해야하는데 이는 실로 엄청나게 번거로운 방법이고 코드도 늘어가게 된다. 실행도 되지 않는 함수때문에 함수의 몸체 부분을 (return 문장만 쓰더라도 블럭을 잡아야 하니까 ) 모두 기제해줘야 하기 때문이다. 그래서 virtual void a() = 0; 와 같은 형식으로 해더 부분을 변경하여 코드를 작성하면 컴파일은 이 함수가 가상 함수라는걸 알고 제어를 오버라이딩 된곳으로 바로 옴기게 된다. 이때 이 함수를 순수 가상 함수라고 한다. 왜냐하면 함수의 몸체가 없기때문에 .. 더보기
virtual 함수 virtual 함수 virtual 함수란 말그대로 가상의 함수이다. 가상이란 실제로 없는데 있는척 훼이크 쓰는거다. virtual 함수는 함수 오버라이딩이 반드시 있어야 하는데 간단하게 오버라이딩을 해보면.. #include class AAA { public: void a() { cout 더보기
함수 오버라이딩 함수 오버라이딩 함수 오버라이딩은 많은 사람들이 재정의 로 알고 있는데 함수 오버라이딩 = 재정의 라는 이론은 잘못된 생각이다. 그 이유를 함께 알아보자!...ㅋㅋㅋㅋㅋ AAA클래스가 있고 BBB클래스가 AAA클래스를 상속 받았다고 가정하자. AAA클래스에 a() 라는 함수가 있는데 이를 BBB클래스에 a() 함수를 다시 만들게 되면 'AAA클래스의 a()함수는 BBB클래스에 의해서 오버라이딩 되었다' 라고 표현한다. 그리고 이때 Base class 의 AAA에 있는 a() 함수는 BBB클래스에 의해서 '은닉 되었다' 라고 표현한다. 이를 소스로 본다면..... class AAA { public: void a() { cout 더보기
접근 권한자 접근 권한자 C++에서 접근 권한자는 3가지 종류가 있다. 1.private 2.protected 3.public 접근 권한은 1에서 3번으로 갈수록 권한의 폭이 넓어진다. 상속시에 기제하는 접근 권한에 의해서 Base class의 멤버 들의 접근 권한이 변경 되게 된다. 예를 들어서 protected 상속을 받게 되면 protected 보다 넓은 권한은 모두 protected로 변경 되며 private는 접근 불가 상태가 된다. 이때 private 로 상속을 받았을때도 Base class 의 private 멤버는 여전히 접근이 불가하다. 더보기
상속 & 멤버이니셜라이저 멤버 이니셜라이저 Base class 의 초기화를 위해서 원하는 생성자 함수를 호출할수 있게 해주는 것이다. 이때 Base class에서는 생성자 함수 오버라이딩 함수가 반드시 존재 하여야한다. #include using std::endl; using std::cout; class Person { int age; char name[20]; public: int GetAge() const { return age; } const char* GetName() const { return name; } Person(int _age=1, char* _name="noname") { age = _age; strcpy(name, _name); } }; class Student:public Person { char maj.. 더보기
객체 포인터! 상속된 객체와 포인터 관계 상속된 클래스의 포인터 변수로 상속 받은 클래스의 객체의 주소를 담을수가 있다. 이는 is a 관계에 의거하여 가능하다고..... #include //using std::endl; //using std::cout; class A{ void a() { cout 더보기
상속이란!? 콜 간단하게 상속 부모에게 특성을 자식이 물려 받는거 처럼 class간의 특성을 물려 받는것을 말한다. 부모 class를 Base class라 하며, 자식 class 를 Derived class라 한다. 상속을 할때는 2개이상의 클래스를 가지고 공통 부분을 뽑은 다음 추상화 하여 하나의 클래스로 만들고 (is a 관계 or has a 관계) 각 각의 클래스는 고유한 특성만을 가지고 상속을 받는다. 형식 Derived class의 객체를 생성하게 되면 호출은 Derived class 의 생성자 함수를 먼저 호출을 하지만 실행은 Base class 의 생성자 함수 실행을 하고, Derived class 의 생성자를.. 더보기
explicit 와 mutable explicit - 문장은 생성자 함수를 선언할때 앞에 키워드로 붙여서 사용한다. C언어 스타일로 생성자 함수를 호출시 (ex : AAA a1 = 10;) 생성자 함수가 묵시적 으로 호출이 되게 되는데 이를 허용하지 않는것이다. C계열이 아닌 다른 프로그램언어를 사용하는 프로그래머가 가독을 하게 될때 여기서 혼란을 야기할수도 있다. 그것을 방지 하기 위함이다. (중요도는 별반...ㅋㅋ) mutable - const 키워드가 붙은 문장에 예외를 두게 된다. const 를 사용하여 만든 멤버 함수안에서 변수에 값을 대입하고자 할때 nutable 키워드를 사용하여 선언한 변수에 대해서는 error 를 발생하지 않는다. ex) class AAA { private: mutable int val1; int val2.. 더보기
const 멤버 함수 cosnt 멤버 함수 const 멤버 함수는 2가지의 특별한 특징을 갖는다. 1.멤버 변수의 값 변경을 허용하지 않는다. 2.멤버 변수 값의 변경에 대한 기회제공도 불가능 하다. 아래 구문은 에러를 이르키는 구문이며 에러 부분에 주석처리된 코드를 넣으면 해결이 가능하다. class Count { Count() : cnt{0}//간접적으로 멤버변수를 조작할수 있는 동기를 부여하기 때문에 에러가 난다. int* GetPtr() const//const int* Getptr() const //const를 맨 압에 붙이게 되면 포인터가 가리키는 대상가지 상수화 시켜버린다. 접근은 가능하지만 변경은 불가능하다. { return &nct;//compile Error } void increment() { cnt++; .. 더보기
const 멤버 변수 & 멤버 이니셜라이져 이 글은 열혈강의 C++ 강의를 들으면서 공부를 하면서 정리한 글이다. cosnt : const 키워드를 붙이고 변수 또는 함수를 기제하면 그 값을 상수화 시켜서 변경을 불가능하게 만든다. 이는 프로그램을 보다 안정적이게 만들어 주는 기능이다. 특히 C++에서는 객체개념이 들어가기 때문에 const가 생각보다 유용하게 사용될수도 있다.특히 C++에서는 객체개념이 들어가기 때문에 const가 생각보다 유용하게 사용될수도 있다. 기본적으로 문법은 다음과 같다. 포인터변수를 사용하게 되면 위치에 따라 상수화 되는 내용이 달라진다. int *const pt = &a; ==> pt가 가리키는 a의 내용을 상수화 한다. 물론 a라는 변수로 내용 변경에 대한 제약은 받지 않는다. 하지만 *pt = 10; 과 같은 식.. 더보기