[c++] friend와 static 그리고 const

조히·2023년 5월 8일
0

const 객체

const SoSimple sim(20);
객체의 상수화 : 이 객체를 대상으로는 const 멤버 함수만 호출 가능

const의 유무도 함수 오버로딩의 조건에 해당이 됨
void SimpleFunc() {...}
void SimpleFunc() const {...}

매개변수로 const 참조자로 받으면, const 멤버 함수를 호출

클래스와 함수에 대한 friend 선언

  • A 클래스가 B 클래스를 대상으로 friend 선언 시, B 클래스는 A 클래스의 private 멤버에 접근 가능
  • A 클래스도 B 클래스의 private 멤버에 직접 접근 가능하려면, B 클래스도 A 클래스 대상으로 friend 선언을 해야 함
class Boy
{
private:
	int height;
    friend class Girl; // Girl 클래스에서 Boy 클래스 멤버 변수 접근 가능
public:
	Boy(int len) : height(len)
    { }
    ....
}

friend class Girl; 의미

  • Girl은 클래스의 이름이다 → 위에서 미리 선언하지 않아도 됨
  • 바로 그 Girl 클래스를 friend로 선언

정보은닉을 무너뜨리기 때문에 되도록 사용하지 않고, 거의 연산자 오버로딩에서 사용됨

함수의 friend 선언 : 전역 함수와 클래스의 멤버함수를 대상으로 friend 선언 가능

C++에서의 static

static의 개념

  • 전역변수에 선언된 static의 의미 : 선언된 파일 내에서만 참조를 허용하겠다는 의미
  • 함수 내에 선언된 static의 의미 : 한번만 초기화되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않음

전역변수 사용 시 필요 없는 접근이 있을 수 있으므로 → 클래스 내에 static 멤버로 선언

static 멤버변수(클래스 변수)
일반 멤버변수와 달리 클래스당 하나씩만 생성
→ 메모리 공간에 딱 하나만 할당 되어 공유됨,
객체 안에 존재하는 것이 아닌, 객체에게 멤버변수처럼 접근할 수 있는 권한을 준 것

static 변수를 생성자에서 초기화하면 안 되는 이유 :
객체가 생성될 때 생성되는 변수가 아니라, 이미 메모리 공간에 할당이 이뤄진 변수이기 때문
int SoSimple::simObjCnt=0;과 같이 초기화
→ SoSimple 클래스의 static 멤버변수 simObjCnt가 메모리 공간에 저장될 때 0으로 초기화하라는 뜻

static 멤버변수의 또 다른 접근방법
static 멤버가 private 선언 : 해당 클래스의 객체들만 접근 가능
static 멤버가 public 선언 : 클래스의 이름, 객체의 이름을 통해 어디서든 접근 가능

static 멤버함수

  • 선언된 클래스의 모든 객체가 공유
  • public 선언 시, 클래스의 이름을 이용해 호출 가능
  • 객체의 멤버로 존재하는 것이 아님
  • static 멤버함수 내에서는 static 멤버변수와 static 멤버함수만 호출 가능

const static 멤버

클래스 내에 선언된 const 멤버변수(상수)의 초기화는 이니셜라이저를 통해야만 가능.
but, const static으로 선언되는 멤버변수(상수)는 선언과 동시에 초기화 가능
const static int RUSSIA = 1707540;

const static 멤버변수는, 클래스가 정의될 때 지정된 값이 유지되는 상수

키워드 mutable

const 함수 내에서 값의 변경을 예외적으로 허용

profile
Juhee Kim | Game Client Developer

0개의 댓글