기존의 지역 변수는 자동 주기를 가지며 정의되는 시점에서 생성되고 초기화되며 정의된 블록이 끝나는 지점에서 소멸한다.
하지만 정적 지역 변수는 주기가 자동 주기에서 정적 주기로 바뀌며 생성된 스코프(=범위, 블럭)이 종료된 이후에도 해당 값을 유지한다.
또한, 정적 변수는 한번만 초기화 되며 프로그램 수명 내내 지속된다.
#include <iostream>
void incrementAndPrint()
{
static int s_value = 1; // 'static' 키워드를 사용한 '정적 생명 주기'
// 이 줄은 한번만 실행된다.
++s_value;
std::cout << s_value << '\n';
} // s_value는 여기서 소멸되지 않지만, 접근할 수 없게된다.
int main()
{
incrementAndPrint();
incrementAndPrint();
incrementAndPrint();
return 0;
}
-실행 결과
2
3
4
결과를 보면 메인 함수 바깥에서 선언된 s_value가 블록을 벗어났어도 값이 초기화 되지 않고 유지되는 것을 알 수 있다.
C언어의 malloc()과 달리 자료형* 변수 = new 자료형 으로 선언하여 동적 메모리를 할당한다.
C언어의 동적 메모리와 같이 사용 후에는 해제를 해줘야 하는데 이때는 free()가 아닌 delete 변수의 형태로 해제를 한다.
#include <iostream>
using namespace std;
int main() {
int* pNum0 = new int(123);
int* pNum1 = pNum0;
cout << *pNum1 << endl;
delete pNum0;
// cout << *pNum0 << endl; 메모리 해제 이후에는 사용할 때 문제가 있다.
int s = 10;
int* arr = new int[s];
// 배열의 길이를 상수가 아니라도 표현 가능
arr[0] = 1;
cout << arr[0] << endl;
delete[] arr;
// 배열을 동적할당 하고 해제를 할 때는 delete[]를 이용한다.
return 0;
}
123
1
구조체는 맴버 변수가 여러개 들어 있기에 변수를 일일이 선언하기보다는 포인터에 메모리를 할당해 사용하는 편이 효율적이다.
기존 구조체에서는 변수.변수로 값을 저장하거나 지정했지만
포인터에서는 -> 연산자를 이용한다.
#include <iostream>
using namespace std;
struct Person {
float weight;
float height;
};
int main() {
Person* person = new Person{ 74.34f, 182.3f };
cout << (*person).height << endl; //(*변수).변수로 표현하는 것이 원형임.
cout << person->height << endl; //->로 대체 가능
Person* persons[2] = {
new Person{12.2f, 190.2f},
new Person{153.12f, 142.11f}
};
cout << endl;
for (Person* person0 : persons) // person0는 주소값
person0->weight = 0.0f;
for (Person* person0 : persons)
cout << person0->weight << endl;
delete person
return 0;
}
182.3
182.3
0
0