![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| 静态成员,友元,共享数据保护 | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-9-12 ![]() |
||||||
|
静态成员 为了解决同一个类的不同对象之间的数据和函数共享问题。 1、静态数据成员(static) 类属性:描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。在C++中是通过静态数据成员来实现“类属性”的。 静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此只能通过类名进行访问,一般的用法是“类名::标识符”。在类的声明中仅仅对静态数据成员进行引用性说明,必须在文件作用域的某个地方使用类名限定进行定义性说明,这是也可以进行初始化。 2、静态函数成员 对于公有的静态成员函数,可以通过类名或对象名来调用;而一般的非静态成员函数只能通过对象名来调用。 静态成员函数可以直接访问该类的静态数据和函数成员;而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。 例:具有静态数据、函数成员的Point类 #include <iostream.h> 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的类成员函数算是重载。 常数据成员 如果在一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该数据成员进行初始化,就只能通过初始化列表。
本文来源:http://blog.csdn.net/minpro/archive/2007/08/30/1765838.aspx
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|