c++类的静态成员

静态成员

由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。类的静态成员分为静态成员变量和静态成员函数。

1 静态成员变量

在类定义中,用关键字static修饰的数据成员为静态数据成员。
该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间,即静态成员的大小不占对象的空间
静态数据是该类所有对象所共有的,可提供同一类的所有对象之间信息交换的捷径。

1.1 静态成员变量的初始化

静态成员变量的初始化是在类外初始化,初始化的语法为
类型名 类名::变量名 = 值

1.2 静态成员变量的使用

1 类名::静态数据成员名
2 通过类实例化出的对象来进行访问
3 通过成员函数来进行访问(静态函数、非静态函数都可以)

#include <iostream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;

class Maker
{
public:
	Maker(int d = 0) :data(d)
	{

	}
	void show()
	{
		cout << "data:" << data << endl;
		cout << "count:" << count << endl;
	}
	static void print()
	{
		cout << "count:" << counnt << endl;
	}
public:
	static int count; // 静态数据成员
private:
	int data;
};
int Maker::count = 0; // 静态数据成员类外初始化

int main()
{
	Maker m;
	m.show(); // 通过普通成员函数访问静态成员变量
	m.print(); // 通过静态成员函数访问静态成员变量
	cout << Maker::count << endl; // 通过类的作用域访问静态成员变量
	cout << m.count << endl;	// 通过实例化的对象访问静态成员变量
	
	// sizeof(m) = 4,静态成员变量不占有类的空间
	cout << "size:" << sizeof(m) << endl; 

	system("pause");
	return 0;
}

2 静态成员函数

函数成员说明为静态,将与该类的不同对象无关,与静态数据成员相反,为使用方便,静态函数成员多为公有的,静态函数的调用与静态变量的调用类似,在对象之外
可以通过作用域运算符进行调用
类名::函数名(参数)

2.1 静态成员函数的性质

一个常规的成员函数声明描述了三件在逻辑上相互不同的事情
1、该函数能访问类声明的私用部分
2、该函数位于类的作用域之中
3、该函数必须经由一个对象去激活(有一个this指针)
但是通过将函数声明为static,可以让它只有前两种性质,即静态成员函数由同一类的所有对象共享,它不具有指向某一具体对象的this指针,即不能通过静态函数访问普通的成员变量和成员函数,静态函数只能管理类中的静态成员和静态函数

class Maker
{
public:
	Maker(int d = 0) :data(d)
	{

	}
	void show()
	{
		cout << "data:" << data << endl;
		cout << "count:" << count << endl;
	}
	static void print()
	{
		// show函数为普通的成员函数,在调用时需要传入this指针
		// 即在调用时会被改写为 show(Maker *const this)
		// print为静态成员函数,没有this指针,调用非法
		show();  // error 静态函数内不能调用普通的成员函数
		
		cout << count << endl; // right
		
		// error 原因同普通成员函数的调用,需要this指针,但是静态成员函数不提供
		cout << data << endl; 
	}
public:
	static int count;
private:
	int data;
};
int Maker::count = 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值