热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++的友元和静态成员小解

有朋友让我帮他做作业,很简单,就是写一个类,包括一个友元函数和一个静态函数,我以前以为懂了,但写起来后发现不是这么回事,加上好久没有写C++了,也几乎没有用过友元和静态成员,所以竟然写不出,

  有朋友让我帮他做作业,很简单,就是写一个类,包括一个友元函数和一个静态函数,我以前以为懂了,但写起来后发现不是这么回事,加上好久没有写C++了,也几乎没有用过友元和静态成员,所以竟然写不出,无奈查了资料,总算完成了,现在总结一下。   我查了网上的资料和一本《C/C++程序设计教程》(郭小刚、金星.人邮出版社,是本不错的书),不过这些资料要不然说得太浅,要不太罗嗦。看完了还是不明白。就像是学校的语文课本,怎么看也不如小说有趣。   不说废话了,我这里用一个例子来吧他说清楚。 /////////////////////////////////////////////////////////////// #include #include using namespace std; class B;

class A { public:  static int n;  A();  A(int iX,int iY); //构造函数重载  void printValue();  friend void show(A*); //声明show为A的友元函数,show可以访问其私有变量.  friend class B;  static void showNo(); //静态函数   private:  int x;  int y;   };

class B { public :  void setA(int x,int y){ a.x = x; a.y = y;}  void getA(){ cout<<"("<

int A::n;

A::A(int iX,int iY = 1) //成员函数设置默认参数 {  x = iX;  y = iY;  n++; } A::A() {  x = 0;  y = 0;  n++; }

void A::printValue() {  cout<<"("<

void show(A* a)  //这里定义一个函数,一般地它不可以访问a的私有变量x和y,但声明为友元函数后就可以。 {  cout<<"("<x+a->y<<")"<

void A::showNo() {  cout<<"there are "<

void main() {  //c1 c2是用不同的构造函数创建的不同对象  A c1(2); //y使用默认值  A c2 ;  c1.printValue();  c2.printValue();  show(&c1);  show(&c2);  A::showNo();  B b;  b.setA(4,5);  b.getA(); } /////////////////////////////////////////////////////////////////////////////   在VC6下通过。   首先看友元。   友元只是一个声明,就好比我声明甲是我的朋友,前提是必须存在甲这个人。和我们的程序对应的就是,先存在一个函数void show(A*),然后A才能用 friend void show(A*)来声明把show当朋友。然后show就能使用a->x直接存取A类私有变量。这样理解,就可以理解为什么show的实现不用A::show(A* a)而是用void show(A *a)。   我们通过修改一下程序,让它产生错误来证明: 去掉friend void show(A*);,就是A没有声明让show()当他的朋友,当然同时main()也不能用A::showNo();。Compiling就出错了,不能用a->x。   所以友元的关键是:首先有一个函数f(),然后可以在类A声明f()是他的友元函数,接着f()中就可以访问A的私有变量了。友元类也如此类推。

  再看静态成员。   静态变量和普通变量的不同就是:1 在内存中的位置不同,它在静态区。2 使用前,必须在全局声明:int A::n; 3 不论有多少个类对象,它们的静态变量占同一个内存。     我们现在把int A::n;去掉再编,COMPILING过了,LINK时出错,不声明就好像没有这块内存。OK!     静态函数理解起来很简单,他只能用static区的变量。

    无聊的时候把他整理一下,也不知道理解得对不对,各位大虾有空指教一下。   外:我竟然发现我那个朋友是给一个女生做的这个作者。役友人来讨老婆。严重鄙视之。   


推荐阅读
  • C++ 类的 this 指针 语法练习5
    #include<iostream>#include<string>usingnamespacestd;定义一个类Studentclass ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
阿依古丽丹_736
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有