• static 멤버 함수

멤버 함수를 static으로 선언이 가능하다.

 

static 멤버 함수는 어떤 특정 객체와도 결합되지 않기 때문에

 

1. 객체에 의해 호출될 필요가 없고, 객체에 의해 호출될 수 없다.

※static멤버변수는 객체에 의해 호출될 수 있다.

그렇기에 this포인터를 가지지 않는다.

 

2. 어떤 객체와도 결합되지 않기에 static 멤버 함수 내에서 사용가능한 멤버는 static 멤버 변수 밖에 없다.

 

3. 접근 지정자에 영향을 받는다.(public만 자유롭게 사용가능)

 

이러한 특징을 지니고 있기에 클래스의 설정 값, 플래그 같은 걸 설정하기에 자주 사용했다.

 


  • 생성자에 new를 사용할 때 주의 사항

생성자에 new를 사용하여 동적할당 받았다면 소멸자에 반드시 delete로 해제 해주자.

 

new와 delete의 사용은 서로 어울려야 한다.

new는 delete와, new [ ]는 delete[ ] 처럼.

 

생성자가 여러개일 경우에는 new면 모두 new, new [ ]면 모두 new [ ] 로 사용해야한다.

이유는 소멸자가 한개이기 때문에 delete도 한번만 사용할 수 있기 때문이다.

 

깊은 복사가 필요한 클래스라면,

깊은 복사에 영향이 가는 static 멤버들도 갱신을 해주자

 


  • 객체 참조형 리턴시 주의

리턴되는 객체가 피호출 함수에 지역적이라면 참조로 리턴하면 안된다.

참조도 내부적으로 포인터로 작동하기 때문에 함수가 끝나면 쓰레기 값을 참조하게 된다.

절대 하지말자~~~

 


  • 객체와 함께 사용하는 위치지정new

객체와 함께 사용하는 위치지정new를 사용하는 경우 주의할 것이 있다.

 

먼저 생성부분이다.

pb와 pc는 buffer에 각 생성되었다.

하지만 생성되는 위치가 겹쳐 pb가 pc에 묻혀서 데이터가 유실될것이다.

그래서 이렇게 바꿔준다.

 

그리고 메모리 해제 부분인데

저 buffer는 delete[ ]로 해제가 가능하다.

그럼 buffer가 해제 될때 그 안에 있던 pb, pc도 메모리 해제가 될까? 한다면

메모리 해제부분에서는 어차피 buffer라는 하나의 메모리로 할당받았으니

buffer라는 메모리만 돌려준다면 메모리상에서는 이상할게 없다.

 

하지만 객체의 소멸자가 호출되는가의 문제가 생긴다.

그래서 buffer가 해제 되기 전에 안에 있던 객체의 소멸자를 모두 호출해준다.

이렇게 실행하면 오류가 난다.

pa는 기본new로 할당받았으니 delete로 해제하여도 문제가 없고

원인은 pb와 pc의 해제 방법이 잘못됐기 때문.

 

이 delete는 new와 연계되지만 위치지정new와는 연계되지 않는다.

그래서 직접 소멸자를 호출해주어야 한다.

 


+ Recent posts