C++의 정적 함수

Jinku Hu 2023년10월12일
C++의 정적 함수

이 기사에서는 C++에서 클래스의 정적 멤버 함수를 사용하는 방법을 보여줍니다.

static 멤버 함수를 사용하여 private static 멤버 변수에 액세스

static 키워드는 C++에서 특정 인스턴스가 아닌 클래스 자체와 연결된 클래스의 멤버를 선언하는 데 사용할 수 있습니다.

정적 멤버 변수는 클래스 본문 내에서 선언되지만 constexpr 규정, const 규정 정수 유형 또는 const 규정 enum이 아닌 한 동시에 초기화할 수 없습니다. 따라서 다른 전역 변수와 마찬가지로 클래스 정의 외부에서 const가 아닌 정적 멤버를 초기화해야 합니다.

주어진 정적 멤버에 private 지정자가 있더라도 BankAccount::rate가 다음 코드 조각에서 초기화되므로 클래스 범위 확인 연산자를 사용하여 전역 범위에서 액세스할 수 있습니다. rate 멤버는 프로그램 시작 시 초기화되면 프로그램이 종료될 때까지 유지됩니다. 사용자가 명시적으로 정적 멤버를 초기화하지 않으면 컴파일러는 기본 이니셜라이저를 사용합니다.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class BankAccount {
 private:
  //    static double rate = 2.2; / Error
  static double rate;
  double amount;

 public:
  explicit BankAccount(double n) : amount(n) {}
  static double getRate() { return rate; }
  static void setNewRate(double n) { rate = n; }
};

double BankAccount::rate = 2.2;

int main() {
  BankAccount m1(2390.32);
  BankAccount m2(1210.51);

  return EXIT_SUCCESS;
}

BankAccount::rate는 모든 BankAccount 객체에 저장되지 않습니다. BankAccount 클래스와 연결된 rate 값은 하나만 있으며 결과적으로 모든 인스턴스는 주어진 순간에 동일한 값에 액세스합니다. 이 동작은 클래스 디자인에서 매우 유용하지만 이 경우 정적 멤버 함수에 중점을 둡니다.

후자는 일반적으로 멤버 액세스 제어 지정자가 클래스의 사용자가 상호 작용하기를 원할 때 적용되므로 정적 멤버 변수에 액세스하는 데 사용됩니다.

즉, private 지정자가 있는 rate 값을 검색하려면 해당 public 멤버 함수가 있어야 합니다. 또한 클래스 자체에 대한 값이 하나만 있기 때문에 개별 호출 개체로 이러한 멤버에 액세스하고 싶지 않습니다.

따라서 정적 멤버 함수인 getRate라는 함수를 구현하고 rate 값을 반환합니다. 그런 다음 BankAccount 유형의 개체를 구성하지 않고 main 함수에서 직접 rate 값에 액세스할 수 있습니다. 정적 멤버 함수에는 사용할 수 있는 this 암시적 포인터가 없으며 클래스의 비정적 멤버에 액세스/수정할 수 없습니다.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class BankAccount {
 private:
  static double rate;
  double amount;

 public:
  explicit BankAccount(double n) : amount(n) {}
  static double getRate() { return rate; }
  static void setNewRate(double n) { rate = n; }
};

double BankAccount::rate = 2.2;

int main() {
  cout << BankAccount::getRate() << endl;
  BankAccount::setNewRate(2.4);
  cout << BankAccount::getRate() << endl;

  return EXIT_SUCCESS;
}

출력:

2.2
2.4
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ Static