C++의 정적 멤버 함수(예)

C++의 정적 함수란 무엇입니까?

C++ 클래스에서 정적 멤버는 해당 개체가 아닌 클래스에 속하는 클래스 멤버입니다. 귀하는 멤버십 사본을 하나만 갖게 됩니다. 이는 생성하는 개체 수에 관계없이 적용됩니다.

클래스 함수가 ​​정적으로 정의되면 모든 클래스 객체는 정적 클래스 멤버를 공유합니다. 따라서 정적 함수는 클래스 개체를 만들지 않고도 액세스할 수 있으며 클래스 개체와 독립적이 됩니다. 클래스 객체. C++의 정적 데이터 멤버는 클래스 외부의 다른 정적 함수에만 액세스할 수 있습니다.

정적 함수를 사용하는 이유는 무엇입니까?

C++ 전역 함수와 달리 정적 함수는 선언 파일에서만 액세스할 수 있습니다. 기능에 대한 액세스를 제한해야 하는 경우 이를 정적으로 만드십시오.

다른 파일에서 동일한 함수 이름의 재사용을 제한하려면 정적 함수를 사용하십시오.

C++에서 정적 함수 정의

구문 :

static int myfunc(void)
{
    cout("Example of C++ static function ");
}

위의 예에서는 myfunc라는 정적 함수를 정의하고 있습니다. 정의에서 static 키워드의 사용을 확인하세요. 키워드는 함수 이름 앞에 옵니다.

C++의 정적 멤버 함수

함수 멤버가 정적으로 선언되면 클래스의 다른 개체와 독립적이 됩니다. 다른 클래스 개체가 없더라도 정적 멤버 함수를 호출할 수 있습니다.

클래스 이름에 접근하려면 클래스 이름과 범위 확인 연산자를 사용해야 합니다. (::). 정적 함수는 다른 정적 함수, 정적 데이터 멤버 및 클래스 외부의 기타 함수에만 액세스할 수 있습니다. 정적 멤버 함수의 범위는 클래스 내에 있으며 이 클래스 포인터에 액세스할 수 없습니다.

예제 1

#include<iostream>
using namespace std;
class BoxClass {
public:
	static int count;
	BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) {
		cout << "Class constructor called." << endl;
		length = l;
		breadth = b;
		height = h;
		count++;
	}
	double getVolume() {
		return length * breadth * height;
	}
	static int getCount() {
		return count;
	}
private:
	double length;     
	double breadth;    
	double height;     
};
int BoxClass::count = 0;
int main(void) {
	cout << "Inital value of count is : " << BoxClass::getCount() << endl;
	BoxClass Box1(3.2, 1.4, 1.8);    
	BoxClass Box2(7.5, 4.0, 4.0);   
	cout << "Final value of count is : " << BoxClass::getCount() << endl;
	return 0;
}

출력:

정적 멤버 함수

다음은 코드의 스크린샷입니다.

정적 멤버 함수

코드 설명 :

  1. C++ 프로그램에 iostream 헤더 파일을 포함하여 기능.
  2. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  3. 라는 클래스를 생성합니다. Box수업
  4. 공개적으로 접근 가능한 클래스 멤버를 표시하려면 public 접근 한정자를 사용하세요.
  5. count라는 정적 클래스 멤버를 선언합니다.
  6. 클래스 생성자를 사용하여 double 유형의 세 변수를 초기화합니다.
  7. 콘솔에 일부 텍스트를 인쇄합니다. endl(끝 줄) 함수는 마우스 커서를 다음 줄로 이동합니다.
  8. l의 값을 가변 길이로 초기화합니다.
  9. b 값을 가변 너비로 초기화합니다.
  10. h 값을 가변 높이로 초기화합니다.
  11. 그런 다음 새 객체가 생성될 때마다 변수 개수의 값을 1씩 늘립니다.
  12. 생성자 본문의 끝입니다.
  13. doublevolume()이라는 함수를 만듭니다.
  14. doubleVolume() 함수가 반환할 내용을 정의합니다. 길이, 너비 및 높이 변수의 곱셈을 반환해야 합니다.
  15. doubleVolume() 함수 본문의 끝입니다.
  16. getCount()라는 정적 함수를 선언합니다.
  17. getCount() 함수는 count 변수의 값을 반환해야 합니다.
  18. getCount() 함수 본문의 끝입니다.
  19. 클래스 멤버를 공개적으로 액세스할 수 있도록 표시하려면 private 액세스 한정자를 사용하세요.
  20. double 데이터 유형의 length라는 클래스 멤버를 선언합니다. 비공개로 액세스할 수 있습니다.
  21. double 데이터 형식의 너비라는 다른 클래스 멤버를 선언합니다. 비공개로 액세스할 수 있습니다.
  22. double 데이터 유형의 높이라는 클래스 멤버를 선언합니다. 비공개로 액세스할 수 있습니다.
  23. 본체의 끝 Box수업 수업.
  24. 그런 다음 정적 멤버를 초기화합니다. Box수업 수업.
  25. main() 함수를 호출합니다. C++ 프로그램 논리는 해당 함수의 본문 내에 추가되어야 합니다.
  26. 새 개체가 생성되기 전에 현재 개체 수를 나타내는 일부 텍스트를 콘솔에 인쇄합니다.
  27. 라는 개체를 선언합니다. Box1은 클래스의 인스턴스 중 하나입니다. Box수업. 너비, 길이, 높이 값은 괄호 안에 지정해야 합니다.
  28. 라는 개체를 선언합니다. Box2는 클래스의 인스턴스입니다. Box수업. 괄호 안에 너비, 길이, 높이 값이 지정되었습니다.
  29. 새 개체를 만든 후 현재 개체 수를 나타내는 일부 텍스트를 콘솔에 인쇄합니다.
  30. C ++ 프로그램 성공적으로 완료되면 값을 반환해야 합니다.
  31. main() 함수 본문의 끝입니다.

정적 함수에 액세스

정적 함수에 액세스하기 위해 클래스 개체를 만들 필요가 없습니다. 대신 클래스 이름 및 범위 확인 연산자를 사용할 수 있습니다. (::).

구문 :

className::funcName

위에서 className은 정적 함수가 정의된 클래스의 이름입니다. funcName은 정적 함수에 할당된 이름입니다.

예제 2

#include<iostream> 
using namespace std;
class MyClass {
public:
	static void msgFunc() {
		cout << "Welcome to Guru99!";
	}
};
int main() {
	MyClass::msgFunc();
}

출력:

정적 함수에 액세스

다음은 코드의 스크린샷입니다.

정적 함수에 액세스

코드 설명 :

  1. 해당 기능을 사용하려면 프로그램에 iostream 헤더 파일을 포함시킵니다.
  2. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  3. MyClass라는 클래스를 만듭니다.
  4. 클래스 멤버를 공개적으로 액세스할 수 있도록 표시하려면 public 액세스 한정자를 사용하세요.
  5. msgFunc()라는 정적 함수 선언. static 키워드는 함수를 정적으로 만듭니다.
  6. 위 함수가 호출/호출되면 콘솔에 인쇄할 텍스트를 지정합니다.
  7. msgFunc() 함수 본문의 끝입니다.
  8. 클래스 본문을 종료합니다.
  9. main() 함수를 호출합니다.
  10. msgFunc()라는 정적 함수를 호출합니다.
  11. main() 함수 본문의 끝입니다.

정적 변수에 접근하기

정적 변수는 클래스 객체가 아닌 클래스에 속합니다. 정적 변수가 공개인 경우 클래스 이름과 범위 확인 연산자를 사용하여 액세스할 수 있습니다. 그러나 정적 멤버가 비공개인 경우에는 불가능합니다.

일반적으로 개인 변수는 공용 함수를 사용하여 액세스됩니다. 단, 클래스 인스턴스/객체를 생성해야 합니다. 해결책은 정적 함수를 사용하는 것입니다.

예제 3: C++ 클래스의 정적 변수

#include<iostream> 
using namespace std;
class AClass {
private:
	static int myvar;
public:
	static int getVar() { 
		return myvar; 
		} 
};
int AClass::myvar = 23; 
int main() {
	cout <<"The value of myvar is: "<< AClass::getVar() << '\n';
}

출력:

정적 변수에 접근하기

다음은 코드의 스크린샷입니다.

정적 변수에 접근하기

코드 설명 :

  1. 우리 프로그램에 iostream 헤더 파일을 포함합니다.
  2. 호출 없이 클래스를 사용하려면 이 프로그램에 std 네임스페이스를 포함하세요.
  3. AClass라는 클래스를 만듭니다.
  4. myvar 변수에 비공개로 액세스할 수 있도록 하려면 비공개 액세스 한정자를 사용하세요.
  5. myvar라는 정적 정수 변수를 만듭니다.
  6. getVar() 함수를 공개적으로 액세스할 수 있도록 표시하는 공개 액세스 수정자를 사용하세요.
  7. getVar()라는 정적 함수를 만듭니다.
  8. getVar() 함수는 myvar 변수의 값을 반환할 수 있어야 합니다.
  9. getVar() 함수 본문의 끝입니다.
  10. AClass 클래스 본문의 끝입니다.
  11. myvar 변수에 23의 값을 할당합니다. 이를 위해 클래스 이름과 범위 확인 연산자를 사용했습니다.
  12. main() 함수를 호출합니다.
  13. 다른 텍스트와 함께 콘솔에 변수 myVar의 값을 인쇄합니다. 이 변수의 값에 액세스하기 위해 클래스 이름, 정적 함수 및 범위 확인 연산자를 사용했습니다.
  14. main() 함수 본문의 끝입니다.

정적 함수의 this 포인터

정적 함수는 객체에 첨부되지 않습니다. 이것이 바로 정적 함수에 이 포인터가 없는 이유입니다. 개체의 포인터는 일반적으로 현재 작업 중인 개체를 가리킵니다. 정적 함수는 객체와 함께 작동하지 않으므로 이 포인터가 필요하지 않습니다.

정적 함수는 다른 정적 멤버에 직접 액세스할 수 있습니다. 그러나 정적 멤버가 아닌 경우에는 그렇지 않습니다. 그 이유는 비정적 멤버는 개체에 속해야 하지만 정적 함수에는 작업할 개체가 없기 때문입니다.

예제 4

클래스 선언 외부에서 정적 함수를 정의하는 것이 가능합니다. 이것을 보여드리겠습니다:

#include<iostream> 
using namespace std;
class NumGenerator {
private:
	static int nextNum; 
public:
	static int getNextNum();
};
int NumGenerator::nextNum = 1;
int NumGenerator::getNextNum() {
	return nextNum++; 
}
int main() {
	for (int count = 0; count < 5; ++count)
		std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n';
	return 0;
}

출력:

정적 함수의 this 포인터

다음은 코드의 스크린샷입니다.

정적 함수의 this 포인터

코드 설명 :

  1. 해당 기능을 사용하려면 코드에 iostream 헤더 파일을 포함합니다.
  2. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  3. Num이라는 클래스를 만듭니다.Generator.
  4. 개인 액세스 수정자를 사용하여 변수를 표시하고 개인 액세스 가능으로 만들려고 합니다.
  5. nextNum이라는 정적 정수 변수를 만듭니다.
  6. 생성하려는 변수를 공개적으로 액세스할 수 있도록 표시하는 데 도움이 되는 공개 액세스 한정자를 사용합니다.
  7. getNextNum()이라는 정적 함수를 선언합니다.
  8. 수업 본문이 끝납니다.
  9. nextNum 변수에 1의 값을 할당합니다. 클래스 이름, 변수 이름 및 범위 확인 연산자를 사용하여 이 작업을 수행했습니다.
  10. 클래스 외부에서 getNextNum() 정적 함수를 정의합니다.
  11. 위 함수가 호출/호출될 때 수행할 작업을 지정합니다. 변수 nextNum의 값을 1씩 증가시킵니다.
  12. getNextNum() 함수 정의가 끝납니다.
  13. main() 함수를 호출합니다. C++ 프로그램 논리는 이 함수의 본문 내에 추가되어야 합니다.
  14. 사용하십시오 for 루프 count라는 변수를 생성합니다. 이 변수의 값은 0에서 4까지 증가해야 합니다. 매 반복 후에 변수의 값은 1씩 증가합니다.
  15. 각 반복마다 콘솔의 다른 텍스트와 함께 변수 nextNum의 값을 인쇄합니다. 값은 getNextNum() 함수를 사용하여 액세스됩니다.
  16. 이 C++ 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
  17. main() 함수의 끝입니다.

요약

  • C++ 정적 멤버는 해당 개체가 아닌 클래스에 속하는 클래스 멤버입니다.
  • 생성한 개체 수에 관계없이 정적 멤버의 복사본은 하나만 갖게 됩니다.
  • 모든 클래스 객체는 각 정적 클래스 멤버를 공유합니다.
  • 클래스 함수를 정적으로 정의한 후에는 클래스 객체로부터 독립됩니다.
  • 클래스 개체를 만들지 않아도 정적 함수에 액세스할 수 있습니다.
  • 그러나 정적 함수에는 클래스 개체를 가리키는 이 개체가 없습니다.