static 정적 멤버와 상수 멤버

2019. 8. 12. 21:56PL/C++

정적 멤버란 클래스에는 포함되어 있는 멤버이지만, 모든 객체가 공유하는 멤버다. 정적으로 선언된 변수는 메모리상에 오직 하나만 할당되어 관리된다. 정적 멤버를 public 선언을 하면 외부의 어떤 클래스에서도 접근이 가능하며 오직 하나로 관리된다

 

선언 후에는 반드시 초기화 작업이 이뤄져야 한다. 호출할 때는 아래와 같이 객체 변수에 의해서도, 클래스 변수에 의해서도 가능하다

 

#include <iostream>

using namespace std;

class Person {
private:
	string name;
public:
	static int count;
	Person(string name) {
		this->name = name;
		count++;
	}
};

// 반드시 초기화되어야 한다
int Person::count = 0;

int main(void) {
	Person a("수리");
	Person b("노을");
	Person c("이즈");
	
	// cout << Person::count << '\n';
	cout << a.count << '\n';
	return 0;
}

 

상수 멤버는 생성자에 의해 한 번 초기화된 이후 수정되지 말아야 할 변수들을 const 상수 멤버로 지정하게 된다. 이후 수정을 한다한들 오류가 발생하고 C++ 관례에 따라 위와 같은 특징을 가지는 변수들은 const 선언으로 미리 제약을 두고 있다

 

const 선언으로 오류가 생기는 부분이 2가지 있었다. 첫 번째는 알다시피 재정의를 할 때 문제가 생겼고, 다른 문제는 생성자로 초기화 과정에서 일반적인 this로 초기화가 불가능하다. 따라서 아래와 같은 방법으로 초기화해야만 한다

 

#include <string>
#include <iostream>

using namespace std;

class Student {
private:
	const int id;
	string name;

public:
	Student(int id, string name) : id(id), name(name) {}
	/* 오류가 생기는 부분
	Student(int id, string name) {
		this->id = id;
		this->name = name;
	}
	*/
	void show(void) {
		cout << "ID = " << id << " 이름 : " << name << '\n';
	}
	/* 오류가 생기는 부분
	void setID(int id) {
		this->id = id;
	}
	*/
};

int main(void) {
	Student st1(1, "노을");
	Student st2(2, "수리");
	Student st3(3, "라온");

	st1.show();
	st2.show();
	st3.show();
	return 0;
}

 

 

'PL > C++' 카테고리의 다른 글

정적 바인딩과 동적 바인딩  (0) 2019.08.12
C++ Boost.Asio 설치  (0) 2019.08.12
2차원 배열에서 &a[5]와 a[5]의 차이  (0) 2019.08.12
friend 클래스  (0) 2019.08.12
상속에서의 생성자와 소멸자  (0) 2019.08.12