>  기사  >  백엔드 개발  >  C++ 클래스의 정적 데이터 멤버 및 정적 멤버 함수

C++ 클래스의 정적 데이터 멤버 및 정적 멤버 함수

php是最好的语言
php是最好的语言원래의
2018-08-06 16:16:402904검색

정적 데이터 멤버

·정적 키워드로 선언됨

·클래스의 데이터 멤버를 정적으로 선언하면 클래스의 개체 수에 관계없이 정적 멤버는 복사본 하나만 갖습니다.

·클래스의 모든 객체에서 정적 수명을 갖는 객체 내 공유

·다른 초기화 문이 없으면 첫 번째 객체가 생성될 때 모든 정적 데이터 멤버가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.