- static 멤버 변수
멤버 변수는 객체마다 존재하며 각각 다른 값을 가질수 있는 반면에
static 멤버 변수는 하나의 데이터로 같은 클래스의 객체가 공유하는 멤버 변수이다.
클래스 내부에 static키워드를 추가하여 멤버 변수를 선언하며
어떠한 스코프 안에 선언된 단순 정적지역변수와 같은 점도 있고 차이도 있다.
1. 차이점으로 먼저 클래스 선언부 안에서 초기화 할 수 없다.
이유는 static 멤버 변수는 객체의 일부분으로 저장되는 것이 아니라 별도로 저장되기 때문이다.
그렇기 때문에 초기화 방법이 다른것이다.
기본 멤버 변수는 객체가 생성될 때 메모리에 올라가며
각 객체마다 다른 값을 가질 수가 있다.
그렇기에 선언부나 생성자에서 계속 초기화가 이루어져도 상관 없지만
static멤버 변수는 초기화될 때 메모리에 올라가게 된다.
초기화가 여러번 되면 매우 혼란스러워지기 때문에
오직 한번만 가능하다.
그렇기에 선언부 외부에 한번 초기화가 가능한것이다.
단 예외로 const를 붙이면 선언부에서 초기화 가능하다.
값이 변하지 않기 때문에 상관없다는 뜻인가?
2. 차이점으로 두가지 접근방법이 있다.
객체를 통한 방법, 범위 결정 연산자를 통한 접근
4. 같은점으로 접근 지정자에 영향을 받는다.
public일때만 외부에서 자유롭게 사용할 수 있다.
protected나 private이면 멤버함수, 정적멤버함수, 프렌드함수 로 접근할 수 있다.
추가로 이 초기화는 헤더파일이 아닌 cpp파일에 넣는다.
프로그램은 헤더 파일을 여러 파일에 포함시킬수 있기 때문에 초기화 구문이 여러 벌 만들어 지는 셈이 되므로
에러가 발생하기 때문이다.
- 추가
기본 멤버변수가 생성자가 아닌 선언과 동시에 초기화도 가능한 이유? (in-class 초기화)
예전 C++에서는 이러한 문법이 허용되지 않았다.
그래서 오직 생성자에서만 초기화가 가능했다.
하지만 멤버변수 한두 개를 초기화하려고 생성자를 쓰는 게 귀찮았는지
저런 문법이 가능토록 변경되었다고 한다.
그 문법을 in class 초기화라 한다
in class 초기화는
in class초기화를 하게되면 멤버이니셜라이저를 사용하는 것과 동일하다.
TODO::차이점 서술하기
1.하지만 멤버이니셜라이저를 사용하는 모든 생성자는 그에 상응하는 in-class 초기화를 무효화한다.
2.밑에 링크 이해 하기
https://blog.naver.com/tipsware/221792822911
https://stackoverflow.com/questions/27352021/c11-member-initializer-list-vs-in-class-initializer
'C++ > [책] C++ 기초 플러스' 카테고리의 다른 글
[ 822p ~ 892p ] static 멤버 함수, 생성자에 new 사용, 객체 참조형 리턴시 주의, 객체와 함께 사용하는 위치지정new (0) | 2022.03.26 |
---|---|
[ 797p ~ 821p ] 특별 멤버 함수, 복사 생성자, 복사 할당 연산자, 깊은 복사 & 얕은 복사 (0) | 2022.03.26 |
[ 763p ~ 790p ] 하나의 매개변수를 취하는 생성자, explicit, 변환 함수, 변환과 프렌드 (0) | 2022.03.24 |
[ 727p ~ 762p ] 프렌드 멤버 함수 (0) | 2022.03.23 |
[ 709p ~ 726p ] 연산자 오버로딩, 연산자 함수, 오버로딩 제약 (0) | 2021.09.13 |