- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 静态成员、友员与成员指针
第8章静态成员、友员与成员指针 8.1 静态成员 一个类的属性或方法可以采用static进行修饰,这样的成员称为静态成员。 8.1.1 静态属性 1. 静态属性是只在对象之间公用的“全局变量” 函数共用一份信息,采用全局变量来实现。 类的对象共用一份信息,采取的方法是将其定义为类的静态属性。 2. 静态属性的定义与初始化 static int no; //类型任意 与普通属性不同的是,静态属性必须在类定义之外进行定义性声明,包括初始化,如: int PointX::no = 0; //仍使用“类名::”作为限定 3. 静态属性的表示方法 类名::静态成员名 如PointX::no 8.1.2 静态方法 8.2 友员 类是经过封装的“黑盒”,普通函数不能访问类的私有成员。 不妨将一个对象看成是一本私人的日记,通常是不允许外人去翻看的,但朋友就可能享有一定的特权,看到日记的内容。如果希望一个普通函数能够直接访问类的成员,也可以将其定义为类的“朋友”。因为这个普通函数并不是类的成员,故称为类的友员。 1. 使用普通函数作为类的友员 如果要将某个普通函数作为类的友员,必须在类定义中进行声明,形式为: class X { ... public: friend type 友员函数名(形式参数表); }; 2. 使用友员时应注意的问题 将一个普通函数定义为类的友员的目的是使其能直接访问类的非公开成员,因此,友员一般要有类对象、类对象引用或类指针为参数(通常是引用),以使友员能借助它们引用类的成员。 那么,究竟是什么使我们甘冒破坏类的封装性的危险而将普通函数定义成类的友员呢?最主要的原因是效率。 使用友员还有一些原因,如可以使运算符重载更加灵活等,但友员并不是一种必需的技术。 3. 向前引用类定义 如果一个类使用在前而定义在后,需要先进行类声明,语法形式如下: class 类名; //类声明语句 这种声明称为类定义的向前引用,也称为超前声明。 4. 类方法作为友员和友类 一个类的方法可以定义为另一个类的友员。 例如,要将类B的方法int fn(int, A)定义成类A的友员,应在类A的定义中加入如下声明: friend int B::fn(int, A); 这使B的fn方法可以直接访问类A的所有成员。此时需要对类A做超前声明。 一个类定义为另一个类的友员,称为友类。 例如,若要将类B定义为类A的友类,必须在类A的定义中加入如下声明: friend class B; //在A的定义中声明B是A的友类 这相当于将类B的所有方法都定义成类A的友员。 8.3 指向类成员的指针 这里所说的指向成员的指针并不是指普通的指针。例如: class XYZ { public: int x, y, z; }; void fn() { XYZ a; int* p = a.x; } 这里的a.x是一个普通的整型变量,p也是一个普通指针,不能称为指向类成员的指针。 8.3.1 利用普通指针访问静态成员 由于类的静态成员是类属的,不与任何对象发生联系。因此,借助普通指针就可以实现静态成员的访问。 8.3.2 指向非静态数据成员的指针 使用一种特殊的指向数据成员的指针访问非静态属性: type 类名::*指针变量名; 这样的指针应该与对象(或引用)和指针联系在一起,并使用“.*”或“-*”运算符访问一个成员,形式为: 对象名.*指向对象成员的指针 对象指针名-*指向对象成员的指针 8.3.3 指向非静态函数成员的指针 一个指向普通函数的指针变量只与函数的原型有关。 class PointX { int x, y; public: static int no; PointX(int x1, int y1):x(x1), y(y1){ no++; } }; int PointX::no = 0; int main( ) { PointX p1(1,1), p2(2,3), p3(3,1); cout PointX::no; } class PointX { int x, y; static int no; //私有静态成员 public: PointX(int x1, int y1):x(x1), y(y1){ no++; } static int getNo(){ return no; } //静态方法 static void increaseNo() { no++; } //静态方法 }; int PointX::no = 0; int main(
文档评论(0)