C++에서 정적 키워드 사용
이 가이드에서는 C++에서static
키워드를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
static
키워드를 사용하여 C++에서 정적 기간으로 변수 선언
static
키워드는 정적 기간으로 지역 변수를 선언하는 데 사용할 수 있습니다. 이름 지정이 제안하는 것과는 달리, 정적 기간이있는 지역 변수는 변수가 선언 된 블록이 범위를 벗어난 후에도 해당 값이 메모리에서 활성 상태로 유지됨을 의미합니다.
기본적으로 이러한 지역 변수는 정의 된 함수 호출 사이에 값을 저장할 수 있습니다. incrementCount
함수에는0
값으로 초기화되는count
라는 변수가 있습니다. count
속성은 프로그램이 종료 될 때까지 활성 상태 인 메모리 영역에 할당됩니다. 따라서incrementCount
에 대한 각 호출은 주어진 정수에 단일 단위를 추가합니다.
#include <iostream>
using std::cout;
using std::endl;
int incrementCount() {
static int count = 0;
return ++count;
}
int main() {
for (int i = 0; i < 20; ++i) {
if (i % 2 == 0) incrementCount();
}
cout << incrementCount() - 1 << endl;
return EXIT_SUCCESS;
}
출력:
10
static
키워드를 사용하여 C++에서 클래스의 정적 멤버 선언
반면static
키워드는 클래스의 정적 데이터 멤버를 선언하는 데 사용됩니다. 이러한 멤버는 클래스의 특정 인스턴스가 아닌 클래스 유형 자체와 연결됩니다. 따라서 주어진 클래스에 대해 정적 데이터 멤버를 정의하면이 클래스 유형의 모든 인스턴스는 데이터 멤버에 대해 동일한 값을 갖게됩니다. 개인 멤버를 갖는 것과 달리 전자는 메모리에 단일 사본을 갖게됩니다. 후자의 기능은 정적 데이터 멤버를 클래스 메모리 풋 프린트 관점에서 효율적으로 만듭니다.
static
데이터 멤버는 일반 데이터 멤버와 다르게 정의되고 초기화됩니다. static
멤버는 클래스 내부에서 선언되고 연관된 소스 파일의 클래스 외부에서 정의되어야합니다. static
키워드는 클래스 내부의 선언에서만 사용됩니다. 정적
데이터 멤버는 생성자에 의해 초기화 될 수 없으며const
정수 유형이 없으면 클래스 본문 내에서 초기화 할 수 없습니다. 후자의 유형은 초기 값 사양없이 클래스 본문 외부에서 정의해야합니다. 다음 예제는 문자열 리터럴로 초기화되고 나중에setNewName
함수로 수정되는static
데이터 멤버name
의 간단한 사용법을 보여줍니다.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
cout << MyClass1::getName() << endl;
MyClass1::setNewName("New name");
cout << MyClass1::getName() << endl;
return EXIT_SUCCESS;
}
출력:
Static name
New name
또는 클래스에 객체에 바인딩되지 않은static
함수 멤버가있을 수 있으므로 본문에서this
객체를 참조 할 수 없습니다. 일반적으로 이러한 함수는 다음 예제 프로그램에 표시된대로정적
데이터 멤버와 유사한 별도의 선언 및 정의를 가질 필요가 없습니다. 그러나 대부분의 현대적인 스타일 가이드는 일반적으로 프로그래머가 둘을 분리해야합니다.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
static bool compareStrings(const std::basic_string<char>& s1,
const std::basic_string<char>& s2) {
if (s1 == s2)
return true;
else
return false;
}
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
MyClass1::compareStrings(m1.getNickname(), m2.getNickname())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
MyClass1::compareStrings(MyClass1::getName(), MyClass1::getName())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
return EXIT_SUCCESS;
}
출력:
strings are not equal
strings are equal
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook