[C++] const, static, friend
REF : 윤성우의 열혈 C++
const 객체
변수를 상수화 하듯, 객체도 상수화할 수 있다.
const SoSimple obj(2);
- 객체에 const선언이 붙으면 이 객체를 대상으로는 const 멤버함수만 호출할 수 있다.
- 이 객체의 데이터를 수정하지 않겠다는 의미.
- 객체의 멤버변수도, 수정하지 않을 값이라면
const
로 명시적으로 선언해줘야한다. - 또한 객체의 멤버함수도 객체 멤버를 수정하지않는다면
const
를 명시적으로 선언해줘야한다.
const 함수 오버로딩
- 함수 오버로딩 -> 매개변수의 수나 자료형이 다름.
-
const 선언도 구분할 수 있다.
- const 함수가 먼저 호출되는 조건은,
함수를 호출한 객체가 const인지 아닌지
에 따라 다르다.
클래스와 함수의 friend 선언
클래스의 friend 선언
- friend선언은 private 멤버의 접근을 허용하는 선언이다.
- A클래스가 B클래스에게 friend 선언을 하면 B는 A의 private 멤버에 접근할 수 있다.
- 반대도 가능케하려면 B클래스가 A클래스에게 friend선언을 해줘야한다.
- friend선언의 위치는 상관없다.
class A
{
private:
int member;
friend class B;
};
class B
{
public:
void ShowFriendMember(A &friend)
{
std::cout<<friend.member<<std::endl;
}
};
- friend 선언 자체는 객체지향의 정보은닉을 무너뜨리기 때문에,
과도해선 안된다.
- cpp과제들에서 friend선언을 금지하는 이유이기도하다.
함수의 friend 선언
- 전역함수, 멤버함수를 대상으로 friend선언이 가능하다.
- friend선언된 함수는 자신이 선언된 클래스의 private 영역에만 접근가능하다.
static
- 멤버변수와 멤버함수에 static을 추가할 수 있다.
- C에서 static
- 전역변수에 선언된 static의 의미
- 선언된 파일 내에서만 참조를 허용
- 함수 내에 선언된 static의 의미
- 한번만 초기화되고, 함수가 스택영역에서 해제되어도 static 변수는 소멸하지 않는다.
- 전역변수에 선언된 static의 의미
- C++에서 static은 느낌이 다르다.
- C++에서 static은
클래스를 위한 전역변수
의 느낌이다. - C처럼 전역변수로 클래스가 공유하는 변수를 생성하면, 어느 클래스든 접근가능하기에 정보은닉과는 거리가 멀어진다.
- C++에서 static은
static 멤버변수
- static 멤버변수는
클래스 변수
라고도 한다. - 멤버변수는
객체마다
생성되지만, 클래스변수는클래스마다
생성되기 때문이다. - static 멤버변수는
생성, 소멸 시점이 전역변수와 동일
하다. -
그리고
해당 클래스인 모든 객체가 공유
한다. - 사용
class SoSimple { private: static int num; }; int SoSimple::num = 0;
- 초기화는 클래스 외부에서 진행한다.
- 생성자에서는 초기화해선 안된다. 객체 생성시마다 초기화된다.
- 멤버함수처럼 이미 메모리에 할당되어있다고 생각해야한다.
- public으로 선언된 static 멤버변수는 클래스이름이나 객체이름으로 접근이 가능하다.
- 단, 이렇게 접근할때는 클래스 이름으로 접근하는게 명시적으로 접근하고자 하는 변수가
멤버변수
인지,static 변수
인지 표현할 수 있다.
- 단, 이렇게 접근할때는 클래스 이름으로 접근하는게 명시적으로 접근하고자 하는 변수가
static 멤버함수
- 선언된 클래스의 모든 객체가 공유한다.
- public으로 선언되면 클래스 이름으로 호출이 가능하다.
- 객체의 멤버로 존재하는게 아니라 메모리상에 독자적으로 존재한다.
- 객체의 멤버가 아니므로 멤버변수에 접근할 수 없다.
- 객체 생성 이전에도 호출할 수 있으므로, 멤버변수에 접근이 불가능하다.
- 클래스로 멤버함수에 접근하면, 어느 객체를 선택해 멤버변수를 접근할 것인가에 대한 오류
static 멤버함수 내에선 static 멤버변수와 static 멤버함수만 호출할 수 있다.
class SoSimple
{
private:
int num1;
static int num2;
public:
SoSimple(int n) : num1(n)
{}
static void Adder(int n)
{
num1 += n; //멤버변수 없음 에러
num2 += n; //멤버변수 없음 에러
}
};
int SoSimple::num2 = 0;
const static 멤버
const 멤버변수의 초기화는 이니셜라이저로만 가능한데,
const static 멤버변수는 선언과 동시에 초기화가 가능하다.
- 클래스가 정의될때부터 값이 정해져 유지되므로, 선언과 동시에 초기화를 허용한다.
mutable
- const 함수 내에서의 값의 변경을 예외적으로 허용한다.
- mutable은 제한적으로, 예외적인 경우에만 사용한다.
- const의 의미가 사라지기때문.
댓글남기기