본문 바로가기

C 언어/C++

c++ 기초단계 (11/15)

클래스 포인터는 구조체 포인터와 같다.

 

코드 내에서

#ifdef DEBUG

   cout << ………… << endl;

#endif

즉, define되있는 부분만 출력을 하겠다는 뜻이다.

debug_00000 

컴파일시 아래와 같이 명령어를 입력하면

g++ –o test test.cpp –DDEBUG=1          //모두 출력

g++ –o test test.cpp –DDEBUG=0          //제한적인 출력

(“audi가 생성되었습니다” 라는 부분이 출력 되있지 않다. 이곳에 #ifdef를 하지 않고 #if만 하였기때문)

이렇게 하면 현재 작성하고 있는 코드에만 집중할 수 있고, 컴파일옵션에서 바꿀수 있는 장점이 있다.

유용하게 써먹도록 하자.

 

myaudio를 초기화 하는 방법

debug_00001-1seg

class audi

{

  myaudio = 0;   <—틀림

}

c에서 구조체 내에서는 초기화가 안되듯이 클래스도 마찬가지다.

하지만 생성자에선 가능하기에 초기화 코드는 생성자에 있어야한다.

 

위처럼 myaudio = audio::audio(“aa”)를 써서 초기화를 시키려고 하면

 debug_00001

세그멘테이면 오류가 뜬다.

이유는 객체 = 객체를 하게 되면 동적할당을 받은 audio가 생성되면서 aa를 두 객체가 모두 가리키게 되는데

먼저 생성자된 audio객체가 먼저 소멸자에 free를 만나서 aa자리가 소멸되고 남아있는 audio가 가리키는 aa의 자리가

사라져 세그멘테이션 오류가 뜬다.

 

초기화하는 방법은 아주 간단하게 아래와 같이 ,myaudio(“문자열”)을 하면 오류 없이 된다.

초기화_00000

[실행결과]

초기화

 

클래스에서 생성자와 소멸자를 밖으로 내보낼 시 클래스명에 스코프 연산자(::)를 생성자와 소멸자 앞에 붙인다.

클래스내에는

{

   생성자();

   소멸자();

};

클래스밖에

클래스명::생성자()

{

}

클래스명::소멸자()

{

}

클래스밖생성자소멸자

 

배열 생성자, 소멸자 순서 알아보기

배열생성

배열생성1

 

배열선언후 {}내에 객체에 값을 대입하고 컴파일시

배열생성_00002

배열생성_00001

 

c++의 특성중 중간에 변수를 선언하고 생성자 소멸자 호출순서를 확인한 결과

배열생성_00003

for문을 한번 돌때마다 생성자가 호출되고 소멸자가 바로 호출되는 것을 확인할 수 있다.

배열생성_00003-1

 

 

과연 iCnt는 main 종료시까지 남아있는지 확인

for컴파일에러_00000

컴파일시

for컴파일에러

결과적으로 컴파일 에러가 출력된다.

iCnt는 for문 종료시점에 사라진다는 걸 알 수 있다.

처음부터 iCnt를 변수로 선언해도 되겠지만 이렇게 임시로 쓸 때는 for문 내에서 한번만 쓰는것이 좋다.

 

전역, 지역, static변수 생성자, 소멸자 호출순서 확인

전역지역호출순서 

전역지역호출순서_00001

전역지역호출순서_00002 

위 실행은 지역변수를 함수호출 전에 했을 때 생성소멸 순서이고 밑에 실행결과는 함수호출 후 지역변수를

넣고 실행한 결과이다. 전역에 선언한것은 역시나 제일 먼저 생성되고 제일 나중에 소멸되지만, 지역과 static은

변경되었다.

 

 

객체지향형 동적할당 new

뉴올드주소값

new는 동적할 당을 하는 연산자이고, delete는 동적할당을 지우는 연산자이다.

c로 치자면 new는 malloc, delete는 free인 셈이다.

뉴올드주소값_00000 

 

배열에 동적할당하는 법

배열할당

내용은 주석과 같다.

 

 

java와 c++의 차이점 살펴보기

예) class z 를 20byte라 가정하고

20

 

class a 객체지향형 동적할당

클래스동적할당

클래스동적할당_00000

'C 언어 > C++' 카테고리의 다른 글

c++ 기초단계 (11/22)  (1) 2011.11.23
c++ 기초단계 (11/21)  (0) 2011.11.21
c++ 기초단계 (11/18)  (0) 2011.11.18
c++ 기초단계 (11/16)  (0) 2011.11.16
c++ 기초단계 (11/14)  (0) 2011.11.14