64비트 프로그램시 사용하는 모델루

윈도우에서는 LLP64 모델을

UNIX에서는 LP64모델을 사용한다.

 

각 모델에 따라 정의되는 자료형의

차이가 있을수 있다.

'C,C++' 카테고리의 다른 글

__int64  (0) 2013.07.21
_WIN64 매크로  (0) 2013.07.21
매크로 사용시 #,## 연산자  (0) 2013.07.19
UNICODE 매크로  (0) 2013.07.19
문자셋  (0) 2013.07.18

64비트 정수형을 말한다.

 

그냥

int는 32비트 정수형

'C,C++' 카테고리의 다른 글

LLP64와 LP64는  (0) 2013.07.21
_WIN64 매크로  (0) 2013.07.21
매크로 사용시 #,## 연산자  (0) 2013.07.19
UNICODE 매크로  (0) 2013.07.19
문자셋  (0) 2013.07.18

64비트 프로그램일경우 정의되는 매크로

'C,C++' 카테고리의 다른 글

LLP64와 LP64는  (0) 2013.07.21
__int64  (0) 2013.07.21
매크로 사용시 #,## 연산자  (0) 2013.07.19
UNICODE 매크로  (0) 2013.07.19
문자셋  (0) 2013.07.18

# 연산자
• 매크로 정의에서 매개변수 앞에 샵(#)을 붙이면, 전처리기는 매크로를 호출할 때 매크로 인수에
서 C-style 스트링 상수를 생성한다.
#define printint(var) printf (# var “= %i\n”, var)

## 연산자
• 매크로 정의에서 ## 연산자는 토큰 2개를 합쳐준다. ##연산자를 매크로의 매개변수 앞에
기술하면, 전처리기는 매크로가 호출될 때 제공되는 매크로의 실제 인수와 ## 뒤에 따라
오는 토큰을 받아서, 하나의 토큰을 생성한다.
#define printx(n) printf (“%i\n”, x ## n)

'C,C++' 카테고리의 다른 글

__int64  (0) 2013.07.21
_WIN64 매크로  (0) 2013.07.21
UNICODE 매크로  (0) 2013.07.19
문자셋  (0) 2013.07.18
가변 인수  (0) 2013.07.09

프로젝트가 유니코드를 사용하게 되면 정의되는 매크로는

UNICODE, _UNICODE가 정의 되며

이 두 매크로와 전처리기를 사용하면

MBCS,WBCS 동시에 지원하는 프로그램이 가능하다.

 

#IF UNICODE

~유니코드용 코드

#ELSE

~멀티바이트 코드

#ENDIF

'C,C++' 카테고리의 다른 글

_WIN64 매크로  (0) 2013.07.21
매크로 사용시 #,## 연산자  (0) 2013.07.19
문자셋  (0) 2013.07.18
가변 인수  (0) 2013.07.09
auto와 static 변수  (0) 2013.07.01

문자셋에는 여러가지 종류가 있다.

그 문자셋을 세 분류로 나눈다.

 

SBCS : Single Byte Character Set

 1바이트 문자셋을 말하며 ASCII 코드와 같이 하나의 문자가 1바이트로 이루어진 문자셋을 말한다

 

MBCD : Multi Byte Character Set

 여러 문자가 서로 다른 바이트 수를 같는 문자셋을 말한다

 영문은 1바이트, 한글은 2바이트를 취급하는 문자셋

 

WBCS : Wide Byte character Set

  문자를 2바이트로 취급하는 문자셋을 말한다.

  UNICODE(UTF-16)는 한글이던 영문이던 모든 문자를 2바이트로 취급한다.

'C,C++' 카테고리의 다른 글

매크로 사용시 #,## 연산자  (0) 2013.07.19
UNICODE 매크로  (0) 2013.07.19
가변 인수  (0) 2013.07.09
auto와 static 변수  (0) 2013.07.01
struct 멤버 바운더리 해결  (0) 2013.06.30

printf 함수 처럼 인수가 몇개가 될지 모르는 경우 사용하는 변수를 가변인수라  한다..

가변 인수는 함수의 원형 정의시에 '...' 으로  한다

예) testvq(...) { 코드 }

 

가변 인수 사용시 가변인수 왼쪽의 인수는 정의해 줘야 한다.

예) testvq(int vqnum,...) {코드}

 

인수들은 스택에 저장된다

오른족 인수부터 왼쪽으로 차례대로 스택에 저장된다

 

따라서 가변인수 사용시 가변인수 왼쪽 인수를 명시적으로

지정하여  두지 않으면

가변인수를 참조할수 있는 방법이 없다

지정하여 두면 그 인수를 기준으로 포인터를 사용

가변인수들을 참조할수 있다.

 

가변인수를 포인터를 사용 참조할수도 있지만

더 쉬운 매크로를 사용하여 참조할수도 있다.

 

va_list 변수명; // 가변인수 참조에 사용할 변수

va_start(변수명,인수); // 변수명은 va_list로정의된 변수, 인수는 가변인수 왼쪽의 인수

변수는 인수의 형 만큼 크기의 다음 메모리를 가리키게 된다

va_arq(변수명,자료형);  //  변수명은 va_list로 정의된 변수, 자료형은

변수명의 현재 위치에서 자료형 크기 만큼의 메모리를 읽어 지정된 자료형으로 반환하며

자료형 만큼 크기의 다음 메모리를 가리키게 된다.

va_end(변수명); //변수명은 va_list로 정의된 변수로 가변인수 참조를 종료한다

'C,C++' 카테고리의 다른 글

UNICODE 매크로  (0) 2013.07.19
문자셋  (0) 2013.07.18
auto와 static 변수  (0) 2013.07.01
struct 멤버 바운더리 해결  (0) 2013.06.30
VC6에서 디버그(Debug),릴리즈(Release) 변경 실행파일 만들기  (0) 2013.03.31

일반적으로 변수 생성시 auto나 static를 생략하면 auto가 지정된 것으로 간주한다.

 

auto 변수는 stack에 생성이되며

해당 변수가 포함된 최하위 블럭이 시작될때 생성이되며

해덩 최하위 블럭이 종료될때 소멸된다.

 

static 변수는 data global 영역에 생성이되며

프로세스가 시작될때 생성이되며

프로세스가 종료될때 소멸된다.

 

heap은 동적인 메모리를 할당할때 사용되는 메모리 영역이다(malloc)

'C,C++' 카테고리의 다른 글

문자셋  (0) 2013.07.18
가변 인수  (0) 2013.07.09
struct 멤버 바운더리 해결  (0) 2013.06.30
VC6에서 디버그(Debug),릴리즈(Release) 변경 실행파일 만들기  (0) 2013.03.31
MFC와 MFC를 사용하지 않는 프로그램 차이  (0) 2013.03.16

struct a {

  char aa;

  int    bb;

}

와 같이 정의한경우

 

메모리 구조는

char aa 1byte

사용않되는 영역 4byte

int bb 4바이트 처럼

 

struct a를 사용하개 되면 메모리에 8바이트가

사용된다 이유는

struct를 사용하는 경우 멤버들은

각 OS의 비트수에 따라

그 시작 위치를 지정한다,

이는 속도를 높이기 위한 방편이다.

 

char aa가 0x7830에 위치에 있다고 가정하면

int bb는 0x7834에 위치하게 된다.

즉 char aa와 int bb 사이 3바이는 사용되지 않지만

메모리는 할당되어 있는 상태가 된다.

 

이처럼 struct 사용시 속도를 위한 각 멤버의

메모리 위치를 지정하는 것을 막기위해서는

 

#prgma pack(1)을 선언하고 사용한다.

 

 

Debug는 실행파일에 디버깅 관련 여러 데이타가 같이 추가하여 작성된다.

Release는 디버깅과는 달리 디버깅에 필요한 정보들을 실행 파일에 포함하지 않는다

 

따라서 Debug로 생성한 실행파일과, Release의 실행파일 크기를 비교해보면 Relase로

만든 실행파일 크기가 훨씬 작다.

 

vc6에서 디버그,릴르즈 모드를  변경하려면

Build 메뉴의 Set Active Configuration을 선택하면 나타나는

 

 대화상자에서 Release와 Debug를 선택함에 따라서

Debug모드 실행파일과, Release 모드 실행파일을 만들수 있다.

윈도우 프로그램은 메세지(운영체제에 이미지 정의된값)를 운영체제에게 받아 메세지를 처리하는 방식이다.

이 메세지를 처리하는 프로시지러를 윈도우 프로시저라고 한다

 

여기서

MFC를 사용하지 않는 경우는 윈도우 프로시저를 사용자가 정의하고, 그 프로시저에 각 메세지가 할일을 지정해야 한다.

그러나 MFC를 사용하는 경우

이 윈도우 프로시저를 작성할 필요는 없다.

메세지 맵이라는 방식을 사용 윈도우 프로시저가 할일을 대신 처리해준다. 단지

어떤 형태의 메세지가 왔을때 어떤 프로시저를 수행할지만 연결해 주면 된다.

#pragma data_seg(.세크먼트명)

  변수=값; .....

#pragma data_seg()

 

DLL은

타 프로세스간 DLL에서 코드 부분으 공유되지만

데이타부분은 공유되지 않고 각 프로세스에 생성된다.

이럴때 DLL에서 타 프로세스에게 데이타를 전달해주어야 하는 경우

이 공유 섹션을 사용하면 편리하다.

 

공유 섹션에의 변수에는 항상 값이 할당이 되어야만 한다.

 

세그먼트명은 임으로 정할수 있다.

 

예)

DLL의 공유메모리의 값을 DLL에서 사용하는 프로세스에 전달

#pragma data_seg(.dseg)

     int g_nNumber = 0xFFFFFFFF;

#pragma data_seg()

 

extern "C" _declspec( dllexport ) int* GetNumberPointer( )
{
return &g_nNumber;
}

DLL을 사용하는 프로세스에서 GetNumberPointer를 호출함로서 공유메모리의 값을 얻을수 있다.

 

static std::string wcs_to_mbs(std::wstring const& str, std::locale const& loc)
{
typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_t;
std::codecvt<wchar_t, char, std::mbstate_t> const& codecvt = std::use_facet<codecvt_t>(loc);
std::mbstate_t state = std::mbstate_t();
std::vector<char> buff((str.size() + 1) * codecvt.max_length());
wchar_t const* in_next = str.c_str();
char* out_next = &buff[0];
codecvt_t::result r = codecvt.out(state, str.c_str(), str.c_str() + str.size(), in_next, &buff[0], &buff[0] + buff.size(), out_next);
return std::string(&buff[0]);
}


static std::string utf8StringToUnicodeString(std::string UTF8String)
{
wchar_t strUnicode[256] = {0,};
char    strMultibyte[256] = {0,};
strcpy_s( strMultibyte,256,(UTF8String.c_str()));
int nLen = MultiByteToWideChar(CP_UTF8, 0, strMultibyte, strlen(strMultibyte), NULL, NULL);
MultiByteToWideChar(CP_UTF8, 0, strMultibyte, strlen(strMultibyte), strUnicode, nLen);
std::locale loc("KOR");
return wcs_to_mbs(strUnicode,loc);
}

 

사용법

utf8StringToUnicodeString(String형 UTF-8  문자열)

String형으로 유니코드 문자열 반환

'C,C++' 카테고리의 다른 글

MFC와 MFC를 사용하지 않는 프로그램 차이  (0) 2013.03.16
공유메모리 영역 설정  (0) 2013.03.10
윈도우 OS,윈도우 생성과,처리  (0) 2012.12.31
예외처리  (0) 2012.11.24
템플릿  (0) 2012.11.22

윈도우는 메세지 처리 방식이라고 한다,

DOS(윈도우 이전의 OS를 말한다) 시대에는 사용자의 입력(마우스 움직임,클릭,키보드 입력등)을

모두 프로그램내에서 처리해주어야 했다.

그러나 윈도우에서는 이런 입력 부분을 OS가 맡아서 처리하개 된다.

OS는 이 입력을 각 프로그램에 전달해 준다

이때 사용되는 것이 메세지란 것으로 전달된다.

메세지는 이미 시스템에 정의된 값이다.

 

각 프로그램은 이 메세지를 받아 처리하느냐 처리하지 않느냐에 따라

입력에 반응하는 또는 반응하지 않는 프로그램이 작성된다.

 

따라서 윈도우를 메세지 처리 방식이라고도 한다.

 

입력 - 윈도우 OS- 각 프로그램와 같이 처리된다.

 

입출력기기는 하드웨어 기기마다 참 다양하다,

입출력기기와 윈도우 OS 사이에 드라이버라는 프로그램이

사용되어 하드웨어 사양은 다 다를지라고 윈도우 OS에는 같은

메세지,기능이 적용될수록 있도록 드라이버 프로그램이 중계 역할을

해준다.

 

OS에는 메세지 큐라는 것이 존재한다.

이 메세지큐는 입력이나 기타 장치에서 발생된 메세지가 우선 쌓인다.

메세지 큐에는 또 시스템 메세지큐가 있고 각 프로그램 메세지 큐가 존잰한다.(OS에 존재하는)

 

각 프로그램에서는 메세지 루프에서 프로그램 메세지 큐의 메세지를 하나씩 가저와 번역 및

처리 요청을 OS에게 보내면 OS는 해당 윈도우의 메세지 처리 프로시저에 그 메세지를 보낸다.

 

윈도우 생성관정

- 윈도우 클래스 제작:

   윈도우에 기본 윈도우 프로시저(메세지 처리 프로시저)로 사용한 프로시저 주소를 지정한다.클래스명
- 등록: 시스템에 윈도우 클래스를 등록한다

- 생성: 등록한 클래스를 사용 윈도우를 생성한다.
- 기타: 생성한 윈도우를 가지고 여러 작업을 처리한다
- 메세지 루프: OS의 프로그램 메세지 큐에서 메세지를 하나씩 가저와 번역한 다음 OS에게 메세지에 해당하는 윈도우에

  메세지를 보내것을 요청하는 반복 루프

'C,C++' 카테고리의 다른 글

공유메모리 영역 설정  (0) 2013.03.10
string(UTF-8)을 유니코드로 변환하여 다시 String 형으로  (0) 2013.01.16
예외처리  (0) 2012.11.24
템플릿  (0) 2012.11.22
연산자 오버로딩  (0) 2012.10.28

예외는 에러와 다르다.

처리상 문제가 될수 있는 값이나,코드들을 말하며

 

try 블럭과 catch 블럭으로 이를 처리한다.

 

try 블러과, catch 블럭은 같이 와야 하다.

try

   {

   코드

   }

catc(예외 형태)

  {

  코드

  }

try 블럭은 하나만 와야하지만, 그에 따른 catch 블럭은 여러개 일수 있다.

이때 Throw가 발생되면 Catch가 순서적으로 확인한다.

처리 될수 있는 예외인지, 처리하지 못하는 경우라면 abort가 호출딘다.

 

예외 발생은 throw를 사용하여 발생 시킨다 try 블럭내에 기술되며, 다른 함수들에서도 기술될수도 있다.

throw 예외 형태 값(일반 자료형 값, 클래스 등등이 올수 있다)

throw 5

 

catch 블럭은 함수와 유사하다.

catch(int ex)

{

 코드

}

 

try이 블럭에서 호출된 함수에서 trow가 있는 경우는

그 함수의 처리가 중단되고, 호출함 함수로 넘어간다. 예외가 넘어간다.

그 함수에서도 예외 처리 문구(Try~catch)가 없다며 그 예외는 그 함수를

호출한 함수로 넘어간다. 이런식으로 갈때

main 함수에도 없다면 시스템으로 넘가므로

stdin.h에 서술된 abort 함수를 호출하게 되며 프로세스는 종료된다.

 

함수에서 발생될수 있는 형태를 지정할수 있다. 그 이외의 예외가 발생되면

역시 마찬가지로 about 함수를 호출하고 프로세스는 종료된다.

함수(인자)throw (예외 형들)

int extest(int a) throw(int,char,carr*)

 

catch에서 모든 예외 처리

catch(...)

 

catch 블럭내에서 trow를 쓰게되면

해당 예외를 현재 try~catch블럭을 포함하는

다른 try~catch 블럭의 catch 블럭에 전달된다.

 

되도록이면 예외를 처리할수 있는 클래스를 따로 만들어 처리 하는 것이 좋다.

그 클래스의 개체를 Thow하여 처리되도록 한다.

예외 처리하는 클래스가 exA라고 하면

throw exA(1,2,3)

이처럼 클래스 개체를 사용하면, 동시에 어떤것 때문에 예외가 발생되었는지 추가적인 정보를 전달할수가 있게 된다.

'C,C++' 카테고리의 다른 글

string(UTF-8)을 유니코드로 변환하여 다시 String 형으로  (0) 2013.01.16
윈도우 OS,윈도우 생성과,처리  (0) 2012.12.31
템플릿  (0) 2012.11.22
연산자 오버로딩  (0) 2012.10.28
virtual  (0) 2012.10.27

template <typename T[, .... ]> 와 같은 형식으로 선언하며

T형을 쓰게되는 함수를 템플릿으로 하게 됩니다.

T Add(T a,T b)

{

 return a+b;

}

 

T는 사용자가 지정하는 이름입니다.

이T의 자료형은 실행시에 결정됩니다.

호출은 함수호출과 마찬가지 입니다.

 

STL = Standard Templeate Library 템플릿으로 표현된 표준 라이브럴

 

템플릿을 특수화

템플릿은 런타임에서 호출될 때마다 그때 형이 결정된다.

이중 지정된 자료형인경우 함수명이 같은 다른 함수를 호출하여 처리되개 할수 있다

이것을 템플릿을 특수화라 한다.

우선 템플릿으로 사용할 함수를 선언,정의하고

 

지정한 자료형에 따른 함수를 선언,정의하기 전에

templat <>

함수 선언,정의를

하게 되면 인수가 선언한 자료형에 속하게되면 이 함수가 처리되개 된다.

template <typename T>

int Add(T a,T b)

{

return a+b;

}

 

template <>

int Add(int a,int b)

{

return a+b+10;

}

 

클래스 탬플릿도 함수 탬플릿과 같은 방법으로 정의,선언하면 되며

원하는 자료형만 바꿔주면 된다.

클래스의 선언과 정의 분리시에

정의 부분에 사용시에 클래스 탬플릿은 다음과 같이 사용한ㄷ

클래스명<템플릿자료형>

test<T>

 

이때

멤버함수를 템플릿에서 정의된 형으로 했다고 할때

클래스 생성 순서에 따라(메모리 확보- 생성자 호출)서 처리되면

형이 아직 결정이 되지 않기 때문에 메모리 확보를 할수가 없다

 

이럴때는 해당 템플릿 클래스 자료형 생성시에 자료형을 지정해준다.

템플릿 클래스명<자료형> 변수명;

 

test<int> aa;

test라는 템플릿 클래스의 개체를 생성하며

메모리 확보시 템플릿 자료형은 int 형으로 한다.

변수명은 aa이다.

 

템플릿 선언의 유효범위는

바로 아래의 요소의 블럭이 끝나는 부분까지이다.

 

따라서 클래스의 선언과 정의를 분리할때는

정의 부분에도 똑같은 템플릿 선언을 또 해주어야 한다.

 

템플릿은 그냥 틀에 지나지 않는다.

컴파일타임에 그엠 맞는 코드가 각각 생성이 된다.

'C,C++' 카테고리의 다른 글

윈도우 OS,윈도우 생성과,처리  (0) 2012.12.31
예외처리  (0) 2012.11.24
연산자 오버로딩  (0) 2012.10.28
virtual  (0) 2012.10.27
protected  (0) 2012.10.25

기본 자료형은 사칙연산이 가능하나,

클래스,구조체 등의 사칙연산이 불가능하다(멤버들에 의한 사칙 연산은 가능)

이른 위해 필요한 것이 연산자 오버로딩이다.

 

연산자 오버로딩에는

전역 함수에 의한 오버로딩과

멤버 함수에 의한 오버로딩이 있다.

 

함수명이

operator연산자 로 된 경우

연산자만 사용해서도 호출이 가능하다

이것이 연산자 오버로딩이 된다.

 

거꾸로 말하면

클라스나 구조체를 연산자를 사용한경우

그 연산자나는

operator연산자 형태로 바뀌며

이것이 전역 함수인지, 멤버 함수인지에 따라 적절히 호출된다.

 

멤버 함수를 사용하는 경우는

개체1 연산자 개체2 라고 할때

연산자는 개체1에 멤버 함수로 연산자 오버로딩 되어 있다면

개체1의 operator 연산자 함수가 호출되면 개체2가 인수로 전달된다.

 

전역 함수를 사용하는 경우에는

연산자의 오퍼랜드가 operant연산자에 다 전달된다.

전달되는 개체의 형은의 멤버는 friend로 선언이되어야지

전역 함수에스 전달된 개체의 멤버에 접근 가능하다.

 

단항 연산자에서 선연산,후연산의 차이(++나 --)

선 연산자는 operator연산자() 형태이며

후 연산자는 operator연사냐(int) 형이라고

약속되어 있다.

여기서 int는 구별하기 위함일뿐 값이 전달되는 것은 아니다.

 

전연함수로 구현될수 없는 상황이 발생할수 있다.

첫번재 오퍼랜드가 기본 자료형이라면 전역 함수로

연산자 오버로딩이 구현될수 밖에 없다.

 

cout도 ostream의 연산자 오버로딩이다.

cin은 istream의 연산자 오버로딩이다.

 

배열도 마찬가지도 [] 연산자 오버로딩이다.

 

클래스엣 디폴트로 추가되는 함수들

해당 함수가 선언이 되어 있지 않다면

-디폴트 복사생성자

-디폴트 생성자

-디폴트 소멸자

-디폴트 오버로딩된 대입연산자

 

'C,C++' 카테고리의 다른 글

예외처리  (0) 2012.11.24
템플릿  (0) 2012.11.22
virtual  (0) 2012.10.27
protected  (0) 2012.10.25
상속  (0) 2012.10.24

클래스의 멤버에 Virtual 이 붙으면 그 멤버는 가상의 멤버가 되며

해당 클래스형으로 호출하게 되면 해당 클래스를 상속받은 클래스의 Overriding된 멤버가 호출된다.

 

Virtual 멤버가 있는 클래스를 상속하면 Virtual 멤버 특성도 상속된다.

 

따라서 Virtual은 상속한 클래스가 Oerriding 멤버를 가졌을때메만 그 효력을 얻을수 있다.

그렇치 않은 경우는 일반 멤버와 다를게 없다.

 

가짜 가상 함수, 순수 가상 함수

Virtual 선언된 멤버(함수)의 몸체 부분 코드가 있는 경우를 가짜 가상 함수라 하며

몸체 부분이 없는 경우를 순수 가상 함수라 한다 이때는 다음과 같이 표시한다

Virtual 형 멤버명=0;

 

Static Binding, Dynamic Binding

해당 클래스 형으로 선언된 개체 변수에서는 해당 형의 멤버만 호출할수 있는 경우 Static Binding

해당 클래스 형 으로 선언되었으나 가리키는 개체의 형에 따라 호출되는 멤버가 결정되는 경우를 Dynamaic Binding

 

이 처럼 순수 가상 함수를 포함하는 멤버는 개체화 될수 없다. 이를 추상 클래스라고 한다.

그러나 이런 클래스도 객체 포인터는 생성 가능하다.

 

상속하는 클래스가 실질적인 내용을 보니 같은 클래스를 상속하는 부분이 있다고 할때

그런 클래스를 상속하는 클래스를 Virtual 상속하게되면(클래스명: Virtual 접근자 클래스명)

결과적인 클래스에서는 Virtul 클래스는 하나만 상속받계된다.

 

다중 상속 표시는 상속 클래스를 ,로 구분해서 표시한다.

돼도록이면 다중 상속은 사용하지 않는 것이 좋다.

'C,C++' 카테고리의 다른 글

템플릿  (0) 2012.11.22
연산자 오버로딩  (0) 2012.10.28
protected  (0) 2012.10.25
상속  (0) 2012.10.24
mutable  (0) 2012.10.11

private는 해당 범위 내에서만 사용 가능

public는 전체 범위에서 사용 가능

 

protected는 private와 public의 중간 형태로

상속 관계에 있을 경우는 허용하고

그 외의 나머지는 private와 같다.

'C,C++' 카테고리의 다른 글

연산자 오버로딩  (0) 2012.10.28
virtual  (0) 2012.10.27
상속  (0) 2012.10.24
mutable  (0) 2012.10.11
explicit  (0) 2012.10.11

형식

Class 클래스명:접근자 상속할 클래스명

예) class SampleTest:public Test

 

상속할 클래스를 Base 클래스, 상위 클래스 라고 한다.

상속 받는 클래스를 Derived 클래스, 하위 클래스라고 하단

 

접근자에는 Publc,Private,Protected가 있다.

상속받은 멤버들의 접근 권한을 변경시킨다.

public > protected > Private  이면

클래스 멤버 접근 권한자는

클래스 상속 접근 권한자보다 클수 없다.

해당 클래스 상속 접근 권한자의

최대 허용 접근 권한자로 변경된다.

예) A 라는 클래스의 멤버 b가 public 멤버일떄

     C 클래스 A 클래스를 private로 상속한다면

    A 클래스에 멤버 b는 public 이였으므로 public은 private보다 크므로

    private에서 최대 허용 접근자는 Private이므로

    A 클래스에 멤버 b는 private로 변경되어 상속된다.

 

 

상속하는 클래스 생성시 실행 순서

1. 클래스 메모리 할당(모든 멤버의 필요한 공간이 할당된다, 상속할 클래스에 대한 메모리도 같이 할당된다)

2. Base 클래스의 생성자 호출

3. Derived 클래스의 생성자 호출

4. Derived 클래스의 생성자 실행

5. Base 클래스의 생성자 실행

 

클래스 생성시 멤버 이니셜라이즈를 사용하여

Base 클래스의 생성자를 명시적으로 지정할 수 있다.

 

생성자 구문

생성자(인수):상속할 클래스(전달된 인수)

이러면

상속할 클래스에 생성자(전달된 인수)가 호출된다

sampletest Val(a,b,c) 라 하면

생성자

sampletest(a,b,c):test(b,c)

 

멤버이니셜라이즈는 Const 변수를 초기화할때에도 사용된다

 

상속하는 클래스 소멸자 실행 순서

1. derived 소멸자 호출

2. base 소멸자 호출

3. 메모리 반환

 

public 상속시 클래스간 관계는 is-a 관계가 되어야 한다.

Student 클래스가 Person 클래스를 상속한다고 할때

 

IS-A 관계

 

HA-A 관계

 

 

 

상속 계층이 내려가면 내려 갈수록 상위 클래스는 일반화(제너럴라이제션)다고 말하고

하위 클래스들은 더 구체화 또는 특제화(스페셜라이제션)말한다.

 

클래스의 멤버로 타 클래스가 멤버로 사용된경우 클래스의 void 생성자 호출만 가능하다.

즉 초기화 할수 없다. 그러나 java나 C#은 가능하다.

 

동적인 개체나, 메모리 할당은 힙에 생성된다.

컴파일시 결정되는 메모리 공간(변수,함수 등)은 스택에 할당된다

'C,C++' 카테고리의 다른 글

virtual  (0) 2012.10.27
protected  (0) 2012.10.25
mutable  (0) 2012.10.11
explicit  (0) 2012.10.11
클래스에서 Static  (0) 2012.09.15

+ Recent posts