第12章 类(14)

126 static类成员

非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在;每个static数据成员是与类关联的对象,并不与该类的对象相关联。

正如类可以定义共享的static数据成员一样,类也可以定义static成员函数。static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。

1. 使用类的static成员的优点

(1)static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。

(2)可以实施封装。static成员可以是私有成员,而全局对象不可以。

(3)通过阅读程序容易看出,static成员与特定类关联。这种可见性可清晰地显示程序员的意图。

2. 定义static成员

在成员声明前加上关键字static将成员设为static。static成员遵循正常的公有/私有访问规则。

class StaticClass
{
public:
	static int counter;
	static int GetCounter()
	{
		return StaticClass::counter;
	}
};
3. 使用类的static成员

可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用。

int StaticClass::counter; //静态的成员变量要进行初始化

int _tmain(int argc, _TCHAR* argv[])
{
	StaticClass sc = StaticClass();
	sc.counter = 100;

	StaticClass &scr = sc;
	scr.counter += 100;

	StaticClass *scp = ≻
	scp ->counter += 100;

	cout << StaticClass::GetCounter() << endl;

	return 0;
}

像使用其他成员一样,类成员函数可以不用作用域操作符来引用类的static成员。

12.6.1 static成员函数

static成员时类的组成部分担不是任何对象的组成部分,因此,static成员函数没有this指针。通过使用static成员显式或隐式地引用this是一个编译时错误。

因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const。毕竟,将成员函数声明为const就是承诺不会修改该函数所属的对象。最后,static成员函数也不能被声明为虚函数。

12.6.2 static数据成员

static数据成员可以声明为任意类型,可以是常量、引用、数组、类类型,等等。

static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

保证对象正好定义一次的最好方法,就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中。

像使用任意的类成员一样,在类定义体外部引用类的static成员时,必须指定成员是在哪个类中定义的。然而,static关键字只能用于类定义体内部的声明中,定义不能标示为static。

1. 特殊的整型const static成员

类的static成员,像普通数据成员一样,不能在类的定义体中初始化。相反,static数据成员通常在定义时才初始化。

这个规则的一个例外是,只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化。

class StaticClass
{
public:
	const static int counter = 100;
	static int GetCounter()
	{
		return StaticClass::counter;
	}
};
用常量初始化的const static数据成员是一个常量表达式。它可以用在任何需要常量表达式的地方。

const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。

const int StaticClass::counter; //静态的成员变量要进行初始化

int _tmain(int argc, _TCHAR* argv[])
{
	cout << StaticClass::GetCounter() << endl;
	return 0;
}
在类内部提供初始化式时,成员的定义不必再指定初始值。

2. static成员不是类对象的组成部分

普通成员都是给定类的每个对象的组成部分。static成员独立于任何对象而存在,不是类类型对象的组成部分,不是类类型对象的组成部分。因为static数据成员不是任何对象的组成部分,所以它们的使用方式对于非static数据成员而言是不合法的。

static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。

static数据成员可用作默认实参,非static数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。使用非static数据成员作默认实参,将无法提供对象以获取该成员的值,因而是错误的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值