好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

静态成员与友元.ppt

31页
  • 卖家[上传人]:博****1
  • 文档编号:568735986
  • 上传时间:2024-07-26
  • 文档格式:PPT
  • 文档大小:222.99KB
  • / 31 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第15章 静态成员与友元 类是类型而不是对象,每个类的对象都是该类数据成员的拷贝然而,往往需要让类的所有对象在类的范围内共享某个数据声明为static的类成员便能在类范围中共享,称之为静态成员友元函数完全是普通的C++函数,不同的是,它可以访问类的保护成员或私有成员,方便编程,提高了效率,但却破坏了类的封装 15.1  静态成员的需要性15.2  静态成员的使用15.3  静态数据成员15.4  静态成员函数15.5  需要友元的原因15.6  友元的使用 #include #include int nextStudentID=0;Class StudentID{public:StudentID( )            {value=++nextStudentID;             cout<<“Assigning student id ”<

      在重用StudentId类的时候,总是还要额外的考虑一个全局变量的处置,这不得不使类的封装性受到伤害返回 一个类的属性是该类所有对象的属性,而不是这个类某个对象的属性因此,我们需要一种能标是类的属性而不是单个对象属性的方法这就是静态成员的作用一个类的静态数据成员是用来表示类的属性的成员,而不是对象的属性的成员成员有数据成员和成员函数之分,静态成员也有静态数据成员和静态成员函数之分静态成员用static声明 #include #include class Student{ public:  Student(char* pName ="no name")  {cout <<"create one student\n";    strncpy(name, pName,40);    name[39]='\0';    noOfStudents++;     //静态成员:每创建一个对象,学生人数增1    cout <

      Student类随着对象的产生,每个对象都有一个name成员值,但无论对象有多少,甚至没有,静态成员noOfStudent也只有一个所有Student对象都共享它,并且能够访问它在Student对象空间中,是没有静态数据成员noOfStudents的,它的空间,不会随着对象的产生而分配,或随着对象的消失而收回所以它的空间分配并不在Student的构造函数里完成,并且空间回收也不在类的析构函数里完成 静态数据成员确实是在程序一开始运行时就必须存在因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化这样,它的空间分配有三个可能的地方:(1)一是作为类的外部接口的头文件,那里有类声明;(2)二是类定义的内部实现,那里有类的成员函数定义;(3)三是应用程序的main()函数前的全局数据声明和定义处 静态数据成员要实际地分配空间,故不能在类声明中定义(只能声明数据成员)类声明只声明一个类的“尺寸与规格”,并不进行实际的内存分配,所以类声明中写成定义“static int noOfStudents=0;”是错误的它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。

      静态数据成员也不能在main()函数之前的全局数据声明处定义,因为那样会使每个重用该类的应用程序在包含了声明该类的头文件后,都不得不在应用程序中再定义一下该类的静态成员 File1.cpp//student类的内部实现部分#include “student.h”//类的成员函数定义(没有包括静态数据成员定义)File2.cpp//应用程序重用了student类#include “student.h”#include int Student::noOfStudents=0 //不便于重用void fn(){Student s1; Student s2; cout<<“Student::number()<#include #include int Student :: noOfStudents =0;  //在类的内部实现中分配空间和初始化student (char * pName ){count << “create one student \ n”; strcpy (name, pName); noOfStudents ++;  //静态成员:每创建一个对象,学生人数增1 cout  noOfStudents <#include void fn() {student s1;   student s2;   cout << Student :: number () <

      class Student{public:Student()              {noOfStudents++;               //…}  static int noOfStudents;  //公共静态数据成员              //…};void fn(Student& s1,Student& s2){cout<

      返回 静态成员函数定义是类的内部实现,属于类定义的一部分它的定义位置与一般成员函数一样与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象如果用对象去引用静态成员函数,只是用其类型 #include class Student{public:static int number ()           {return noOfStudents;}            //…protectd: Char name[40];  Static int noOfStudents; };int Student :: noOfStudents =1;void main(){Student s;cout << s.number () <<‘\t’;   //ok用对象引导静态成员函数cout << Student :: number () <

      因为类的静态成员总是存在的include class Student{public:static char* sName()  //静态成员函数是所有对象共享的           {cout<

      同样,如果一个类A与另一个类B的关系非常密切,那么可以通过将类A定义为类B的“友元类”来为类A的所有成员函数提供直接访问类B的非公有成员的能力 有时候,普通函数需要直接访问一个类的保护或私有数据成员如果没有友元机制,则只能将类的数据成员声明为公共的,从而,任何函数都可以无约束的访问它普通函数需要直接访问类的保护或私有数据成员的原因主要是为提高效率返回 申明一个函数f()是另一个类B的友元函数的方式是:在类B的定义体中说明函数f(),并且在类名前面加上friend关键字:Class B    { friend 函数f()的原型声明;       //其他类成员的定义或声明};在类B中声明的友元函数f:(1)它不是A的函数成员2)f的定义可以在类B的说明内,也可以在类外3)函数f虽不是A的成员,但有权访问和调用A的所有私有及保护成员 申明一个类A是另一个类B的友元类的方式是:在类B的定义体中说明类A,并且在类名前面加上friend关键字:Class B    { friend class A;       //其他类成员的定义或声明};在类B中说明的友元类A:(1)它可能是与B无关的另外一个类。

      2)类在类外说明(3)类A有权访问和调用类B的所有成员,包括私有及保护成员当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()就可以直接访问类B的任何成员,包括私有和保护成员,这一点就像是一个家庭的知心朋友可以知晓这个家庭的所有秘密一样  使用友元的注意事项:(1)friend不是双向的,即如果将类A定义为类B的友元,那么类A就可以直接访问类B的私有成员,但这并不意味着类B的成员函数可以直接访问类A的私有成员,需要在类A中说明类B为它的友元类2)友元不是类的成员也就是说,友元不受类成员访问控制的限制,它只是一个说明,可以放在类定义体中的任何地方public,private等限定符对其不起作用3)除了一般的函数可以是友元函数外,一个类的成员函数也可以成为另一个类的友元函数,这时的友元说明需要加上类域的限定 int func(int,float);  //一个一般函数class A{public:void memfunc(char *);  //类A的成员函数//…};class B{friend int func(int,float);friend void A::memfunc(char *);//类B的其他成员}; 面向对象程序设计主张程序的封装,数据的隐藏,不过任何事物都不是绝对的,友元的概念是C++语言为用户提供的在局部打破这种封装和隐藏的手段,好像一个家庭的财物,总是要通过防盗门、门锁、保险柜等措施不让外人接触。

      但在特殊情况下,例如全家出游,又需要检查煤气、水、电等情况,就不得不把钥匙交给可依赖的朋友这位朋友就是友元不过友元的概念有点类似于结构程序设计语言中的goto语句,虽有必要设置,但不宜多用。

      点击阅读更多内容
      相关文档
      安徽省安全员《A证(企业负责人)》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪业务操作》预测试卷三.docx 安徽省安全员《A证(企业负责人)》模拟试卷一.docx 2026年房地产经纪人《房地产交易制度政策》模拟试卷四.docx 安徽省安全员《B证(项目负责人)》冲刺试卷二.docx 2026年房地产经纪人《房地产经纪专业基础》预测试卷四.docx 2026年房地产经纪人《房地产经纪业务操作》考前点题卷一.docx 2023年通信工程师《通信专业实务(传输与接入-无线)》试题真题及答案.docx 安徽省安全员《A证(企业负责人)》试题精选.docx 2026年房地产经纪人《房地产经纪专业基础》预测试卷二.docx 2026年房地产经纪人《房地产经纪业务操作》考前点题卷二.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷三.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪专业基础》考前点题卷二.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷五.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷四.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷一.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷四.docx 安徽省安全员《B证(项目负责人)》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪业务操作》模拟试卷二.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.