《c++数据共享和成员特性》由会员分享,可在线阅读,更多相关《c++数据共享和成员特性(29页珍藏版)》请在金锄头文库上搜索。
1、*1面向对象程序设计第11章 数据共享和成员特性*2主要内容 多文件结构和工程 (对象的)作用域和生存期 静态成员 共享数据的保护 友元*31.多文件结构和工程 一个源程序可以划分为多个源文件:类声明文件(.h文件)类实现文件(.cpp文件)类的使用文件(main()所在的.cpp文件) 利用工程来组合各个文件(Ex_ProgramStruct)*42作用域和生存期 函数原型作用域 函数原型中的参数,其作用域始于 “(”,结束于“)”。 块作用域 在块中声明的标识符,其作用域自声明处 起,限于块中 类作用域 文件作用域块作用域类作用域文件作用域*5可见性 (不同作用域的同名变量/对象) 可见性
2、是从对标识符的引用的角度来 谈的概念 可见性表示从内层作用域向外层作用 域“看”时能看见什么。 如果标识在某处可见,则就可以在该 处引用此标识符。块作用域类作用域文件作用域(Ex_ExternScope)*6静态生存期和动态生存期 静态生存期 变量/对象的生存期与程序的运行期相同 static变量/对象,全局变量/对象 动态生存期 开始于程序执行到声明点时,结束于命名 该标识符的作用域结束处。(Ex_StaticScope)*7静态数据成员不属于任何一个具体的对象,而是类 的所有对象共享的数据成员 定义: 在类体内定义static数据成员 初始化: 必须在类体外初始化。(不能在构造函数中初始化
3、!) 静态数据成员不属于任何一个对象,所以必须初始化!:=; 引用 : 访问权限同普通数据成员 私有的一样不能被外部访问 静态数据成员可以由任意访问权限许可的函数访问(如 :类的成员函数)。3 类的静态成员*8class Point int x,y;public: Point(int x1=0,int y1=0) x=x1;y=y1;countP+;static int countP; ; int Point:countP=0; void main() Point p1(1,2); Point p2(3,4); cout(); 调用:();静态成员函数*11例 静态成员函数 #include
4、int s=0; class Sample private:static int n; public: Sample(int i) n=i; static void add() s+=n; ; int Sample:n=0; void main() Sample a(2),b(5); Sample:add();cout &; 常引用所引用的对象不能被更新。 如果用常引用做形参,便不会意外地发生对实参的更改。引用:int i=10;int n=123;常引用:const int n=123/错误4.1 常引用*16例 常引用#include using namespace std; void d
5、isplay(const double int main() double d(9.5); display(d); void display(const double cout const ;或 const ;const int i=10; /常量必须初始化const Point p(1,2);常对象也是值(对象的数据成员)不能改的变量。改变对象数据成员的可能方式?4.2 常对象*19class Cloth private: int ID; /条形码 public: int size; /服装尺寸 public: Cloth(int id,int s) ID=id;size=s; void p
6、rint() cout () const; 注意 const是函数类型的一个组成部分,因此函数声明、实现 部分都要带const关键词。 常成员函数不能更新数据成员,也不能调用该类中没有用 const修饰的成员函数. 常对象只能调用它的常成员函数,而不能调用其他成员函 数. 能够区分重载函数。 void print();void print() const;/这是对print的有效重 载.*24class Cloth private: int ID; /条形码 public: int size; /服装尺寸 public: Cloth(int id,int s) ID=id; size=s; v
7、oid print() cout (); 注:友元函数说明可在类的任何部位(public区, protected区)意义完全一样。 友元函数的定义一般在类外 (一般与类的成员函数定义放在一起) 注意 友元函数可直接访问该类的所有成员(公有的、私有的 、保护的),但它不是成员函数,它可以像普通函数 一样在任何地方调用。(Ex_FriendFun)(Ex_FunFriend)*282 友元类(friendclass)定义:类A定义中用关键词friend说明类B friend class例如:类B是类A的友元类 class A friend class B; ; 则类B的所有成员函数都是类A的友元函
8、数。Ex_ClassFriend*29友元friend小结 友元的声明在类内,定义一般在类外 包括(友元函数、友元类) class A friend int f(int a); /友元函数 friend class B; /友元类 int f(int a) Class B . 友元的单向性和非传递性 单向性:B是A的友元类,并不意味A也是B的友元 非传递性:C是B的友元类, B是A 的友元类,并不意味C是A的友元类 非继承性:B的A的友元类,并不意味着B的派生类是A的友元类类A的友元函数f 它不是A的成员函数,但有权访问和调 用A的所有私有及保护成员 定义一般在类外,但也可以在类内类A的友元类B B的任一函数都有权访问和调用A的所 有成员,包括私有和保护的成员 一定要在类外定义