Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75641
  • 博文数量: 35
  • 博客积分: 1640
  • 博客等级: 上尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-05 11:44
文章分类

全部博文(35)

文章存档

2011年(1)

2008年(34)

我的朋友
最近访客

分类: C/C++

2008-05-05 13:10:33

静态成员

为了解决同一个类的不同对象之间的数据和函数共享问题。例如,我们抽象出某公司全体员工的共性设计出雇员类,如果需要统计雇员总数,这个数据存放在什么地方呢?若以类外的变量来存储总数,不能实现数据隐藏。若在类中增加一个数据成员用以存放总数,必然在每一个对象中都存储一副本,不仅冗余,而且每个对象分别维护一个“总数”,势必造成数据的不一致性。因此,比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员,即静态数据成员。

1、静态数据成员(static

类属性:描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。在C++中是通过静态数据成员来实现“类属性”的。

静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此只能通过类名进行访问,一般的用法是“类名::标识符”。在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某个地方使用类名限定进行定义性说明,这是也可以进行初始化。

2、静态函数成员

对于公有的静态成员函数,可以通过类名或对象名来调用;而一般的非静态成员函数只能通过对象名来调用。

静态成员函数可以直接访问该类的静态数据和函数成员;而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问

例:具有静态数据、函数成员的Point

#include

Class Point

{

Public:

       Point( int xx = 0, int yy = 0) { X = xx; Y = yy; countP++;}

       Point( Point &p);

       Int GetX() {return X; }

       Int GetY() {return Y; }

       Static void GetC() {cout <<  “Object id = “ << countP << endl;  //静态函数成员

 

Private:

       Int X, Y;

       Static int countP;                         //静态数据成员引用性说明

}

 

Point :: Point (Point &p)

{

       X = p.X;

       Y = p.Y;

       countP++;

}

 

Int Point :: countP = 0;           //静态数据成员定义性说明,初始化,使用类名限定

 

Void main()

{

       Point A ( 4, 5 );

       Cout << “Point A,” << A.GetX() << “,” << A.GetY();

A.GetC();                 //通过对象名引用静态函数成员

Point B( A );

Cout << “Point B,” << B.GetX() << “,” << B.GetY();

Point :: GetC();            //通过类名引用静态函数成员

       }

友元

在类的成员函数外部是没办法直接访问类的私有成员的。

友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。也就是说,通过友元的方式,一个普通函数或者类的成员函数可以访问到封装于某一类中的数据,这相当于给类的封装挖了一个小孔。

在一个类中,可以利用关键字friend将别的模块(一般函数、其他类的成员函数或其他类)声明为它的友元,这样这个类中本来隐藏的信息(私有、保护成员)就可以被友元访问。

如果友元时一般的函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都成为友元函数。

1、 友元函数

友元函数是在类声明中由关键字friend修饰的非成员函数。它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。(原来在除了本类成员函数之外的地方是不能访问它们的)

2、  友元类

A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。

友元关系是不能传递的。

友元关系是单向的。如上例,反过来,B的成员函数是不能访问A 类私有和保护成员的。

 

 

共享数据保护

虽然数据隐藏保证了数据的安全性,但各种形式的数据共享却又不同程度地破坏了数据的安全。因此,对于既需要共享、又需要防止改变的数据应该声明为常量进行保护,因为常量在程序运行期间是不可改变的。同样,声明对象时也可以用const进行修饰,称为常对象。

1、 常引用

Const 类型说明符  &引用名;

所引用的对象不能被更新。

如果用常引用做形参,便不会发生对实参意外的更改。

 

2、 常对象

类名 const 对象名;

它的数据成员值在对象的整个生存期间内不能被改变。即常对象必须进行初始化,而且不能被更新。

 

3、 const修饰的类成员

常成员函数

类型说明符  函数名(参数表) const

注意:

     const是函数类型的一个组成部分,因此在实现部分也要带const关键字

     常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数(这就保证了在常成员函数中绝对不会更新数据成员的值)

     如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数(这就是C++语法机制上对常对象的保护,也是常对象唯一的对外接口方式)。

     Const关键字可以被用于参与对重载函数的区分。也就是说加了const的类成员函数算是重载。

 

常数据成员

如果在一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该数据成员进行初始化,就只能通过初始化列表。

阅读(923) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~