본문 바로가기

분류 전체보기

(308)
[C++] 가상 함수, 가상 파괴자 void main() { Human H("김사람"); Student S("이학생",1234567); Human *pH; Student *pS; pH=&H; // 당연히 가능 pS=&S; // 당연히 가능 pH=&S; // 가능 // pS=&H; // 에러 pS=(Student *)&H; pS->Intro(); } 자식은 부모 객체의 모든 것을 가지고 있기 때문에 부모 포인터는 자식을 가리킬 수 있지만 부모는 자식 객체의 모든 것을 가지고 있지 않기 때문에 자식 포인터는 부모를 가리킬 수 없다. class Base { public: void OutMessage() { printf("Base Class\n"); } }; class Derived : public Base { public: void OutMes..
[C++] 포함, private 상속, public 상속 상속은 클래스를 재활용하는 방법 중 하나이다. 상속 이외에도 클래스를 재활용하는 방법이 있다. class Date { protected: int year,month,day; public: Date(int y,int m,int d) { year=y;month=m;day=d; } void OutDate() { printf("%d/%d/%d",year,month,day); } }; class Product { private: char Name[64]; char Company[32]; Date ValidTo; int Price; public: Product(char *aN, char *aC, int y,int m,int d, int aP) : ValidTo(y,m,d) { strcpy(Name,aN); strc..
[C++] 다중 상속과 virtual 클래스 클래스는 두개 이상의 클래스도 상속받을 수 있다. 하지만 동일한 클래스나 같은 기반 클래스를 공유하는 클래스들을 상속받으면 문제가 발생한다. B와 C는 a라는 멤버를 가지는 A를 같은 기반 클래스로 가지고 있는데, D에서는 그럼 a라는 멤버를 B클래스의 것이라고 봐야할까? 아니면 C클래스의 것이라고 봐야할까? 이런 모호한 문제가 발생하기 때문에 사용하는 것이 가상기반(virtual) 클래스이다. 가상 기반 클래스는 간접적으로 두번 상속되어도 클래스에는 멤버를 한번만 상속시킨다. class B : virtual public A .... class C : virtual public A .... class D : public B, public C { protected: int d; public: D(int a..
[C++] 상속받은 멤버 초기화 상속 객체가 생성될 때 생성자가 실행되기 전에 초기화 리스트가 실행된다. 초기화 리스트는 객체의 기반 클래스의 생성자를 호출한다. Coord(int ax, int ay) { puts("Coord 생성자");x=ax;y=ay; } Point(int ax, int ay, char ach) : Coord(ax,ay) { puts("Point 생성자");ch=ach; } Circle(int ax, int ay, char ach, int aRad) : Point(ax,ay,ach) { puts("Circle 생성자");Rad=aRad; } Circle을 생성할 때 위와 같이 기반 클래스로 한 단계씩 올라가서 상속받은 멤버를 초기화하고 상속받은 멤버 초기화가 끝나면 자신의 멤버를 초기화 한다. void main()..
[C++] 복사 생성자 Person(const char *aName, int aAge) { Name=new char[strlen(aName)+1]; strcpy(Name,aName); Age=aAge; } ~Person() { delete [] Name; } void main() { Person Boy("강감찬",22); Person Young=Boy; Young.OutPerson(); } Person Young = Boy; 에서 Young은 Boy가 가리키는 Name과 메모리를 공유하게 된다. 그런데 이 코드에서 파괴자에서 오류가 발생하는데, 두 Person 객체가 메모리를 공유하기 때문에 파괴자에서 할당한 메모리를 해제할 때 같은 메모리를 두 번 해제하기 때문에 에러가 발생하는 것이다. 정수형인 Age끼리 값이 복사되는 것..
[C++] 연산자 오버로딩 위는 연산자 오버로딩 할 때 사용하는 연산자 함수의 원형이다. 인수는 대상에 더해지는 값, 피연산자이다. Complex의 레퍼런스가 아니라 Complex 자체를 인수로 해도되지만 크기가 클수록 속도가 느려지기 때문에 속도가 빠른 레퍼런스를 이용한다. 포인터를 사용할 수도 있지만 포인터를 사용하면 계산식이 A+(&B)처럼 더러워지기 때문에 A+B처럼 가독성이 좋은 레퍼런스를 이용한다. 또한 피연산자는 바꿀일이 없기 때문에 const로 지정한다. 함수 맨 뒤에 const를 붙임으로써 상수 함수로 지정을 했는데 그 이유는 A+B를 할 때 A가 바뀌지 않아야 하기 때문이다. const Complex operator +(const Complex &T) const { Complex R; R.image = image..
[C++] 프렌드 friend 프렌드 함수 class Some { friend void func(); .... }; 클래스 선언부에 함수를 friend로 지정하면 클래스 내의 private 를 포함한 모든 멤버를 사용할 수 있다. 프렌드 클래스 class Some { friend class Any; .... }; 클래스 선언부에 클래스를 friend로 지정하면 Any의 멤버함수가 Some의 모든 멤버에 접근할 수 있다. 프렌드 멤버 함수 class Some { .... friend void Any::func(Some &S); }; 클래스 선언부에 멤버함수를 friend로 지정하면 Any의 func함수만 Some의 모든 멤버에 접근할 수 있다. 프렌드 멤버함수는 보통 대상 클래스를 인수로 가지고 있기 때문에 Some 클래스 원형 -> ..
[C++] 디폴트 인수 void OutChar(int x, int y, char c='-',int n=10); //원형 void main() { OutChar(0,1); OutChar(0,2,'='); OutChar(0,3,'>',30); } void OutChar(int x, int y, char c/*='-'*/,int n/*=10*/) //정의부 { int i; gotoxy(x,y); for (i=0;i