집 >백엔드 개발 >C#.Net 튜토리얼 >C++ 클래스의 정적 데이터 멤버 및 정적 멤버 함수
·정적 키워드로 선언됨
·클래스의 데이터 멤버를 정적으로 선언하면 클래스의 개체 수에 관계없이 정적 멤버는 복사본 하나만 갖습니다.
·클래스의 모든 객체에서 정적 수명을 갖는 객체 내 공유
·다른 초기화 문이 없으면 첫 번째 객체가 생성될 때 모든 정적 데이터 멤버가 0으로 초기화됩니다.
·클래스 외부에서 정의 및 초기화 , 범위 결정 연산 기호(::)를 사용하여 해당 클래스가 속한 클래스를 나타냅니다.
예:
#include <iostream> using namespace std; class Box { public: static int count; //若该静态数据成员在private部分声明,则只能通过静态成员函数处理 Box(double l = 2.0, double b = 2.0, double h = 2.0) { cout << "One constructor was called." << endl; length = l, width = b, height = h; count++; //每创建一个对象时加1 } double Volume() { return length * width * height; } ~Box() { count--; } private: double length, width, height; }; //初始化类Box的静态成员 int Box::count = 0; int main(void) { Box Box1(3.3, 1.2, 1.5); Box Box2(8.5, 6.0, 2.0); cout << "Total objects: " << Box::count << endl; //输出对象的总数 return 0; }
멤버 함수를 정적으로 선언하면 클래스의 특정 개체에서 함수를 분리할 수 있습니다.
· 클래스 개체가 존재하지 않는 경우에도 호출할 수 있습니다. 클래스 이름과 범위 확인 연산자 ::를 사용하여
·정적 멤버 함수는 정적 멤버 데이터, 기타 정적 멤버 함수 및 기타에만 액세스할 수 있습니다. 클래스 Function 밖의 다른 객체
·정적 멤버 함수는 클래스 범위를 가지며 클래스의 this 포인터에 액세스할 수 없습니다. 정적 멤버 함수를 사용하여 클래스의 특정 객체가 생성되었는지 확인할 수 있습니다.
·정적 멤버 함수 사용 비정적 멤버에 액세스하려면 개체 전달이 필요합니다
예:
#include <iostream> using namespace std; class Box { public: static int count; Box(double l = 2.0, double b = 2.0, double h = 2.0) { cout <<"One constructor was called." << endl; length = l, width = b, height = h; count++; } double Volume() { return length * width * height; } static int getCount() { //静态成员函数 return count; } private: double length, width, height; }; int Box::count = 0; int main(void) { //在创建对象之前输出对象的总数 cout << "Inital Stage Count: " << Box::getCount() << endl; Box Box1(3.3, 1.2, 1.5); Box Box2(8.5, 6.0, 2.0); //在创建对象之后输出对象的总数 cout << "Final Stage Count: " << Box::getCount() << endl; return 0; }
참고:
정적 멤버 함수와 일반 멤버 함수의 차이점:
·정적 멤버 함수에는 이 포인터가 없습니다. 정적 멤버 함수에만 액세스할 수 있습니다(정적 멤버 변수 및 정적 멤버 함수 포함)
·일반 멤버 함수에는 이 포인터가 있으며 클래스의 모든 멤버에 액세스할 수 있지만 정적 멤버 함수에는 이 포인터가 없습니다. 생성자와 소멸자의 호출 상태를 이해하는 정적 멤버
#include <iostream> using namespace std; class A { friend class B; //类B是类A的友元 public: static int value; static int num; A(int x, int y) { xp = x, yp = y; value++; cout << "调用构造:" << value << endl; } void displayA() { cout << xp << "," << yp << endl; } ~A() { num++; cout << "调用析构:" << num << endl; } private: int xp, yp; }; class B { public: B(int x1, int x2) : mpt1(x1 + 2, x2 - 2), mpt2(x1, x2) { cout << "调用构造\n"; //mpt是类A的对象,有几个mpt,有关类A的操作便执行几次 } void set(int m, int n); void displayB(); ~B() { cout << "调用析构\n"; //析构函数在类结束前调用,类结束的时候释放类申请的空间 } private: A mpt1, mpt2; //将A类的对象声明为B类的私有数据成员 }; int A::value = 0; int A::num = 0; void B::set(int m, int n) { mpt1.xp = m * 2, mpt1.yp = n / 2; } void B::displayB() { mpt1.displayA(); } int main() { B p(10, 20); cout << "Hello world!" << endl; B displayB(); //通过友元,使类B输出类A的私有数据成员 return 0; }
관련 기사:
C++ 정적 멤버 및 상수 멤버 사용C++ 검토 요점 요약 5 정적 멤버 변수 및 멤버 함수
위 내용은 C++ 클래스의 정적 데이터 멤버 및 정적 멤버 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!