출처 : 도서 - 그림으로 배우는 C++ Programming Basic
정적 멤버의 원리
- 클래스는 객체에 연결되지 않은 멤버를 가질 수도 있음 이를 '클래스 전체에 연결되었다'라고 부름
- 클래스에 연결된 멤버는 정적 멤버(Static Member)라고 부름
- 정적 멤버가 되는 데이터 멤버 및 멤버 함수를 선언할 때는 static이라고 하는 기억 클래스 지정자를 붙여야 함
#include <iostream>
using namespace std;
// Car 클래스 선언
class Car {
private:
int num;
double gas;
public:
static int sum; // 정적 데이터 멤버
Car();
void setCar(int n, double g);
void show();
static void showSum(); // 정적 멤버 함수
};
// Car 클래스 멤버 함수의 정의
Car::Car() {
num = 0;
gas = 0.0;
sum++;
cout << "자동차가 만들어졌습니다. \n"; // 생성자가 호출될 때 정적 데이터 멤버 sum의 값을 1증가 시킴
}
void Car::setCar(int n, double g) {
num = n;
gas = g;
cout << "차량 번호를 " << num << "으로, 연료량을 " << gas << "으로 바꾸었습니다. \n";
}
void Car::showSum() { // 정적 멤버 함수 정의
cout << "자동차는 모두 " << sum << "대 있습니다. \n";
}
void Car::show() {
cout << "차량 번호는 " << num << "입니다." << endl;
cout << "연료량은 " << gas << "입니다" << endl;
}
int Car::sum = 0; // 정적 데이터 멤버 초기화
// Car 클래스의 이용
int main(int argc, const char * argv[]) {
Car::showSum(); // 정적 데이터 함수 호출
Car car1; // 객체 생성
car1.setCar(7777, 95.7);
Car::showSum(); // 정적 데이터 함수를 한번 더 호출
Car car2;
car2.setCar(9999, 72.4);
Car::showSum();
return 0;
}
자동차는 모두 0대 있습니다. // 정적 멤버 함수는 0대라고 출력
자동차가 만들어졌습니다. // 객체가 생성
차량 번호를 7777으로, 연료량을 95.7으로 바꾸었습니다.
자동차는 모두 1대 있습니다. // 정적 멤버 함수는 1대라고 출력
자동차가 만들어졌습니다.
차량 번호를 9999으로, 연료량을 72.4으로 바꾸었습니다.
자동차는 모두 2대 있습니다.
Program ended with exit code: 0
--------------------------------------
static int sum; // static을 붙여 정적 멤버로 만듦
sum은 클래스와 연결되어 있기 때문에 각 객체의 생성자 안에서 초기화시킬 수 없음
함수 바깥에서 Car::를 붙여 초기화시킴
자동차 객체가 하나 생성될 때마다 생성자 안에서는 sum++라는 문장이 실행, 그 결과 값이 1씩 증가
결과적으로 변수 sum은 Car 클래스를 통해 몇 대의 자동차가 만들어졌는지(객체의 개수가 몇 개인지)를 저장하는 필드가 된 것
정적 데이터 멤버란, 같은 클래스의 모든 객체들이 공통적으로 접근해야 하는 데이터를 저장하는 데이터 멤버
static void showSum(); // 정적 멤버 함수
멤버 함수에 static을 붙이면 객체를 생성하지 않더라도 호출할 수 있음
정적 멤버 함수는 객체를 생성하지 않은 상태에서도 호출할 수 있어야 하기 때문에 일반적인 함수와 호출 방법이 다름
정적 멤버 함수의 호출
클래스명 :: 함수명(인수 목록);
Car :: showSum(); // 클래스 이름을 붙여서 함수를 호출
정적 멤버 함수 안에서는 일반 멤버에 접근할 수 없음
정적 멤버 함수 또한 특정한 객체에 연결된 것이 아니기 때문
'C++' 카테고리의 다른 글
포인터 연산자 예제 (0) | 2021.01.21 |
---|---|
예제1 (0) | 2021.01.21 |
is a / has a (0) | 2021.01.11 |
C++ 문제 풀이 (0) | 2021.01.11 |
소켓 프로그래밍 함수와 Winsock2 (0) | 2020.12.17 |