C++的静态成员变量和静态成员函数

C++的静态成员变量和静态成员函数

静态成员变量和静态成员函数算是C++面向对象编程中的一个重点和难点,这里的静态具体指什么呢?与普通的成员变量和成员函数相比,静态成员函数和静态成员变量是属于类的,而不是属于对象的,也就是说,在类实例化为对象之前,静态成员变量和静态成员函数就已经分配了内存空间了,而普通成员函数和成员变量只有在对象产生之后才会分配空间。下面我们来详细看看他们的用法

(一)静态成员变量

1.在类中声明静态数据成员只要加上static关键字即可:

class A{
private:
	static int a;
	//这样a就是类A的静态成员变量了
};

特别注意:在使用静态成员变量之前一定要初始化。初始化静态成员变量,必须在全局作用域中定义,如果定义的时候不给出初值,则默认初值为0。当然,静态成员变量在类中只能声明而不能定义的。

2.静态成员变量不属于任何对象,静态成员变量是由类的所有对象共享的

静态成员变量只存储一份供所有对象共用,所以在所有对象中都可以共享它的值,使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
下面我们来看一个小例子:

class A {
public:
	static int a;
};
int A::a = 0;

int main() {
	A temp0;
	temp0.a = 5;
	A temp1;
	cout << temp0.a << endl;
	cout << temp1.a << endl;
}

很显然输出结果是两个5,这也很容易说明静态成员变量是所有对象共享的,他的值在这个类中的任何一个对象中都相同。

3.静态成员变量在const函数中可以修改

class A {
public:
	static int a;
	int b;
	void changea(int i) const {
		this->a = i;
	}
	/*void changeb(int j) const {
		this->b = j;
	}*/
	//很显然,这段被注释的代码会报错
};
int A::a;

int main() {
	A temp0;
	temp0.changea(6);
}

cosnt函数的作用是保护调用这个const函数的对象(即this指针指向的对象)的所有普通成员变量,使其不能被修改,但是静态成员变量不属于任何对象,所以可以修改。

(二)静态成员函数

静态成员函数的声明很简单,只要在类的成员函数前加上static关键字即可,静态成员函数也是属于类的,它并不属于任何对象。静态成员函数中是不能访问本类中的非静态成员变量的,所以在c++中,静态成员函数的主要功能就是访问静态成员变量。当然,非静态成员函数也可以访问静态成员变量。

下面我们来看一个例子:

class A {
public:
	static int a;
	int b;
	static void showa(){
		cout << a << endl;
	}
	/*static void showb() {
		cout << b << endl;
	}*/
	//这段被注释的代码会报错
};
int A::a = 9;

int main() {
	A temp0;
	temp0.showa();
}

很明显我们可以看出静态成员函数无法访问非静态成员变量。

下面列出使用静态成员函数的几个注意点:

1.静态成员函数不能调用非静态成员函数,但是非静态成员函数可以调用静态成员函数
2.静态成员函数没有this指针,也就是说静态成员函数不能使用const修饰符
3.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。

静态成员函数的一个优点是可以在任何类的实例被创建之前调用它们,这使得它们可以用来执行复杂的初始化任务,这些任务必须在创建类的对象之前完成。

总结一下:其实不论是静态成员变量还是静态成员函数,它们都是不依赖于对象而存在的。
对于非静态成员变量和非静态成员函数,类在定义之后并不为他们分配存储空间,而是在定义类的对象的时候才分配存储空间。相反,静态的成员变量和静态的成员函数在定义类时已经在内存中开辟了内存空间,所以静态成员变量可以被独立的访问(在任何对象没有建立起来时都可以访问),并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用。

2019年5月22日

发布了19 篇原创文章 · 获赞 61 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_43907422/article/details/90443964