您的位置:GIS门户网 GIS开发 正文
GIS网内容搜索
GIS网热门内容
GIS网推荐内容
GIS网最新内容
提出意见和建议

C++ class中的静态(static)成员

GIS门户网提示:本文章共3241字,分3页,当前第1页,快速翻页:
 

(1)       静态数据成员

   ①一般地静态数据成员在该类定义之外被初始化,如同一个成员函数被定义在类定义之外一样。在这种定义中的静态成员的名字必须被其类名限定修饰,例如下面是_interestRate的初始化

// 静态类成员的显式初始化

#include "account.h"

double Account::_interestRate = 0.0589;



   ②静态数据成员的初始化不应该被放在头文件中,而应该放在含有类的非inline 函数定义的文件中。静态数据成员可以被声明为任意类型。例如:



#include <string>

class Account

{

// ...

private:

    static const string name;

};

const string Account::name( "Savings Account" );



作为特例,整型的const 静态数据成员可以在类体中用一常量值初始化。例如,如果决定用一个字符数组而不是string 来存储账户的姓名那么我们可以用int 型的const 数据成员指定该数组的长度,例如:



// 头文件

class Account {

// ...

private:

static const int nameSize = 16;

static const char name[nameSize];

};

// 文本文件

const int Account::nameSize; // 必需的成员定义

const char Account::name[nameSize] = "Savings Account";



用常量值作初始化整型的const 静态数据成员是一个常量表达式(constant expression)。如果需要在类体中使用这个被命名的值,那么,类设计者可声明这样的静态数据成员。例如,因为const 静态数据成员nameSize是一个常量表达式,所以类的设计者可以用它来指定数组数据成员name 的长度。在类体内初始化一个const 静态数据成员时,该成员必须仍然要被定义在类定义之外。但是因为这个静态数据成员的初始值是在类体中指定的所以在类定义之外的定义不能指定初始值。

因为name 是一个数组,不是整型,所以它不能在类体内被初始化。任何试图这么做的行为都会导致编译时刻错误,例如:



class Account {

// ...

private:

static const int nameSize = 16; // ok: 整型

static const char name[nameSize] =

"Savings Account"; // 错误

};

name 必须在类定义之外被初始化。

这个例子还说明了一点我们注意到成员nameSize 指定了数组name 的长度,而数组name的定义出现在类定义之外

const char Account::name[nameSize] = "Savings Account";

nameSize 没有被类名Account 限定修饰。尽管nameSize 是私有成员,但是name的定义仍没有错。如同类成员函数的定义可以引用类的私有成员一样,静态数据成员的定义也可以。静态数据成员name的定义是在它的类的域内,当限定修饰名Account::name被看到之后,它就可以引用Account 的私有数据。



③静态数据成员的访问

1.     在类的成员函数中可以直接访问该类的静态数据成员,而不必使用成员访问操作符:

inline double Account::dailyReturn()

{

    return( _interestRate / 365 * _amount );

}

2.     在非成员函数中,我们必须以如下两种方式访问静态数据成员:

   I. 使用成员访问操作符

class Account {

// ...

private:

friend int compareRevenue( Account& , Account* );

// 余下部分未变

};

// 引用和指针参数来说明对象和指针访问

int compareRevenue( Account &ac1, Account *ac2 )

{

double ret1, ret2;

ret1 = ac1._interestRate * ac1._amount;

ret2 = ac2->_interestRate * ac2->_amount;

// ...

}

ac1._interestRate 和ac2->_interestRate都引用静态成员Account::_interestRate
 

收藏本页:

点这里复制本页地址发送给您QQ/MSN上的好友
相关文章

你应当如何学习C++(以及编程)(长,精)
CMMI中项目开发经理职责
浙江移动通过GIS加强BOSS决策案例
ArcGIS API for Flex (beta) 已经发布,提供
ArcGIS Server9.2学习开发(6)——使用Nav
ArcGIS Server9.2学习开发(5)——使用Too
ArcGIS Server9.2学习开发(4)——使用Toc
ArcGIS Server9.2学习开发(3)——使用Map
ArcGIS Server9.2学习开发(2)——安装配置
ArcGIS Server9.2学习开发(1)——写在前面
win2003_iis6服务器设置排错解答
ArcView GIS 应用与开发技术(1)-View&Th
ArcView GIS 应用与开发技术(2)-Tables
ArcView GIS 应用与开发技术(3)-地理要素
如何实现API钩子
(转)如何使应用程序只运行一个实例
在VC中怎样实现软件的注册机制
VC++中的Win32 Application和Win32 Console
How Google Map Works
实验:居心叵测的Chrome?

相关评论


GIS门户网提示:本文章所属分类:首页 GIS开发
GIS

GIS