首頁  >  文章  >  後端開發  >  C++類別的靜態資料成員與靜態成員函數

C++類別的靜態資料成員與靜態成員函數

php是最好的语言
php是最好的语言原創
2018-08-06 16:16:402924瀏覽

靜態資料成員

·用關鍵字static聲明

·當聲明類別的資料成員為靜態時,無論創建多少個類別的對象,靜態成員都只有一個副本

·在類別的所有對像中共享,具有靜態生存期

·若不存在其他的初始化語句,在創建第一個物件時,所有的靜態資料成員被初始化為零

·在類別外定義和初始化,用範圍解析運算子(::)來指明所屬的類別

舉例:

#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;
}

靜態成員函數

把成員函數宣告為靜態的,就可以把函數與類別的任何特定物件獨立開來

·在類別物件不存在的情況下也能被調用,使用類別名稱加範圍解析運算子 :: 即可存取

·靜態成員函數只能存取靜態成員資料、其他靜態成員函數和類別外部的其他函數

·靜態成員函數有一個類別範圍,不能存取類別的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;
}

註:

靜態成員函數與普通成員函數的差異:

·靜態成員函數沒有this 指針,只能存取靜態成員(包括靜態成員變數和靜態成員函數)

·普通成員函數有this 指針,可以存取類別中的任意成員;而靜態成員函數沒有this 指針

使用靜態成員了解建構與析構函數的呼叫情況

#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 複習重點總結之五靜態成員變數及成員函數

#

以上是C++類別的靜態資料成員與靜態成員函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn