1998.6.6 조경민
C++과 객체 지향
-------------------------------------
C++과 객체 지향의 관계
[]. 순수 가상 함수의 용도
베이스 클래스에다가 파생된 클래스의 함수의 본체를 virtual
로 지니고 싶을때.
class base {
:
virtual print() = 0;
:
};
순수 가상함수는 함수의 형태가 아니기 때문에
base bb;
로 객체를 만들어도 함수는 구현되지 않는다.
디스트럭처를 순수 가상함수로 구현해도 컴파일은 되지만 링크시
디스트럭터 함수가 정의 되지 않았다고 에러가 난다.
[]. 추상 클래스
//순수 가상 함수의 모임으로 클래스 본체를 나타내는 클래스
class a : virtual public b
이렇게 함으로써 클래스 a는 클래스 b를 공용 상속받되
virtual즉 늦은 바인딩(연결)을 하게 된다. ( lately dynamic binding)
즉 클래스 상속되는 연결이 나중에 일어나게되는것이다.
즉.
class base;
class a : public base; // 선언과 동시에 상속 연결이 일어난다.
// early dynamic binding
class b : public base; // 선언과 동시에 상속 연결이 일어난다.
class c : public a, public b;
,- a --- base
c -
`- b --- base
< 사례 1 : 그냥 쓸경우 >
=> 만일 base::print를 c가 불를 경우
a의 base::print를 부르는지
b의 base::print를 부르는지
불분명해져서 에러가 난다. ( base 객체는 현재 두개가 된다.)
class base;
class a : virtual public base; // 나중에 연결이 결정된다.
// lately dynamic binding
class b : virtual public base;
class c : public a, public b;
,- a -
c - `- base
`- b -'
< 사례 2 : virtual class inheritance >
=> base::print를 c가 불러도 오류가 없다.
단지 a::print가 재정의 되었을경우
c::print호출시 a가 더 가깝기때문에(세분화되었기때문에)
a::print가 호출된다. 역시
a::print가 존재하고 b::print가 존재한다면
c에서 print를 호출할경우 두가지가 레벨이 같기때문에
에러가 난다.
[]. 클래스 복사
class a,b;
a = b
클래스 복사시 맴버 함수는 포인터가 아니기에 복사가 안되고 멤버
데이타만 되지만 맴버 함수가 가상함수인경우 이 함수는 포인터
이기에 복사가 된다.
[]. inline 의 용도
inline은 일반함수 호출의 방식을 따르지 않고 함수의 본체가
호출된 부분에 직접 복사되게 됩니다. 이렇게 되면서 속도의 향상을
꾀할수 있다. 단지 제한이 되는 경우는
- 1000줄을 넘을수 없다.
- for문같은 반복문은 있을수 없다.
만일 제한 조건을 벚어나게되면 일반함수로 inline을 무시하게 됩니다.
클래스에서는 클래스 본체에서 함수 정의, 선언을 하면 즉시 inline화
됩니다.
class a{
int z;
public:
get(){return z;} // 자동 inline으로 인식
};
[]. a++ or ++a ?
가능하다 operator 선언을 다음처럼 한경우
#include <stdio.h>
class cls{
public:
int x;
operator ++() // ++xx를 위한 것
{
x++;
}
operator ++(int) // xx++ 를 위해 의미없는 int인자를 받는다.
{
x++;
}
};
void main()
{
cls xx;
xx.x =10;
printf("%d ",xx.x);
printf("%d ",xx.x++);
printf("%d ",++xx.x);
}
10 10 12
C++과 객체 지향
-------------------------------------
C++과 객체 지향의 관계
[]. 순수 가상 함수의 용도
베이스 클래스에다가 파생된 클래스의 함수의 본체를 virtual
로 지니고 싶을때.
class base {
:
virtual print() = 0;
:
};
순수 가상함수는 함수의 형태가 아니기 때문에
base bb;
로 객체를 만들어도 함수는 구현되지 않는다.
디스트럭처를 순수 가상함수로 구현해도 컴파일은 되지만 링크시
디스트럭터 함수가 정의 되지 않았다고 에러가 난다.
[]. 추상 클래스
//순수 가상 함수의 모임으로 클래스 본체를 나타내는 클래스
class a : virtual public b
이렇게 함으로써 클래스 a는 클래스 b를 공용 상속받되
virtual즉 늦은 바인딩(연결)을 하게 된다. ( lately dynamic binding)
즉 클래스 상속되는 연결이 나중에 일어나게되는것이다.
즉.
class base;
class a : public base; // 선언과 동시에 상속 연결이 일어난다.
// early dynamic binding
class b : public base; // 선언과 동시에 상속 연결이 일어난다.
class c : public a, public b;
,- a --- base
c -
`- b --- base
< 사례 1 : 그냥 쓸경우 >
=> 만일 base::print를 c가 불를 경우
a의 base::print를 부르는지
b의 base::print를 부르는지
불분명해져서 에러가 난다. ( base 객체는 현재 두개가 된다.)
class base;
class a : virtual public base; // 나중에 연결이 결정된다.
// lately dynamic binding
class b : virtual public base;
class c : public a, public b;
,- a -
c - `- base
`- b -'
< 사례 2 : virtual class inheritance >
=> base::print를 c가 불러도 오류가 없다.
단지 a::print가 재정의 되었을경우
c::print호출시 a가 더 가깝기때문에(세분화되었기때문에)
a::print가 호출된다. 역시
a::print가 존재하고 b::print가 존재한다면
c에서 print를 호출할경우 두가지가 레벨이 같기때문에
에러가 난다.
[]. 클래스 복사
class a,b;
a = b
클래스 복사시 맴버 함수는 포인터가 아니기에 복사가 안되고 멤버
데이타만 되지만 맴버 함수가 가상함수인경우 이 함수는 포인터
이기에 복사가 된다.
[]. inline 의 용도
inline은 일반함수 호출의 방식을 따르지 않고 함수의 본체가
호출된 부분에 직접 복사되게 됩니다. 이렇게 되면서 속도의 향상을
꾀할수 있다. 단지 제한이 되는 경우는
- 1000줄을 넘을수 없다.
- for문같은 반복문은 있을수 없다.
만일 제한 조건을 벚어나게되면 일반함수로 inline을 무시하게 됩니다.
클래스에서는 클래스 본체에서 함수 정의, 선언을 하면 즉시 inline화
됩니다.
class a{
int z;
public:
get(){return z;} // 자동 inline으로 인식
};
[]. a++ or ++a ?
가능하다 operator 선언을 다음처럼 한경우
#include <stdio.h>
class cls{
public:
int x;
operator ++() // ++xx를 위한 것
{
x++;
}
operator ++(int) // xx++ 를 위해 의미없는 int인자를 받는다.
{
x++;
}
};
void main()
{
cls xx;
xx.x =10;
printf("%d ",xx.x);
printf("%d ",xx.x++);
printf("%d ",++xx.x);
}
10 10 12
'KB > C/C++' 카테고리의 다른 글
volatile (0) | 2004.03.19 |
---|---|
몇가지 코드 최적화 (0) | 2004.03.19 |
콤마에 대해서 (0) | 2004.03.19 |
예전 콜링 컨벤션 (0) | 2004.03.19 |
재미로 보는 C/C++언어 (0) | 2004.03.19 |