类中指定的访问权限对友元函数是无效的,因此把友元函数说明放在类的私有部分、公有部分、保护部分效果都一样。友元函数可定义在类外,也可在类内。程序的执行结果如下:n=324使用友元函数计算两点间的距离。......
2023-11-07
与友元函数一样,类也可以声明为另一个类的友元,这时成为友元类。若B类为A类的友元类,则B类的所有成员函数都是A类的友元函数,都可以访问A类的私有和保护成员。友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
一般的语法格式如下:
通过友元类声明,友元类的成员函数可以通过对象名直接访问到隐藏的数据,达到高效协调工作的目的。在较为复杂的问题中,实现不同类之间的数据共享,友元类的使用也是很必要的选择。
关于友元类,还需要注意以下几点:
(1)友元关系是不能传递的,B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。
(2)友元关系是单向的,如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数不能访问B类的私有、保护数据。
(3)友元关系是不能继承的。例如:函数f()是类A的友元,类A派生出类B,函数f()并不是类B的友元,除非在类B中做了特殊说明(有关继承的概念将在第6章介绍)。
【例3.15】分析以下程序的执行结果。
解:上述程序中,将类B说明为类A的友元类,因此类B的成员函数可以访问类A的私有数据。程序的执行结果如下:
n=5(www.chuimin.cn)
但是,尽管类B中的成员函数display是类A的友元函数,但不能直接调用display(a),这样会出现以下编译错误:
error C2065:'display':undeclared identifier(display为未说明的标识符)
【例3.16】编写一个程序,实现栈的压入(进栈)和弹出(出栈)。其中有两个类:一个是节点类Node,它包含节点值data和指向下一个节点的指针next;另一个类是栈类Stack,它包含栈的头指针top。链式栈如图3.1所示。
图3.1 链式栈
解:先声明节点类Node,其中又将栈类Stack作为Node类的友元类。由于Node和Stack相互引用,故其中的一个类必须先作不完整声明即前向引用声明,在程序开头,使用“class Stack;”语句对类Stack进行前向引用声明。
栈类Stack作为节点类Node的友元类,因此Stack类中的所有成员函数都可以访问Node类对象的私有成员,从中看到,Stack类的push和pop成员函数都对Node类的私有成员data和next进行了操作。
对于空栈,其top成员为NULL,进栈时,先建立一个Node对象*p,将其作为栈顶节点,top指向它;出栈时,后移top并删除原栈顶节点。完整的程序如下:
程序的执行结果如下:
出栈次序:4 3 2 1
有关C++程序设计基础教程的文章
类中指定的访问权限对友元函数是无效的,因此把友元函数说明放在类的私有部分、公有部分、保护部分效果都一样。友元函数可定义在类外,也可在类内。程序的执行结果如下:n=324使用友元函数计算两点间的距离。......
2023-11-07
递增和递减可以位于操作数左侧和右侧。图4.2.4递增和递减递增和递减只能用于变量、对象属性,不能用于直接量、函数返回值和表达式返回值。动手写4.2.5执行4.2.5.html,修改属性的值时正常输出,修改函数返回值时抛出错误,打开浏览器控制台能看到错误信息,如下图所示。图4.2.5递增和递减使用限制递增和递减只能用于标识符,不能用于直接量、表达式返回值、函数返回值,非法使用会被识别成缺少对应操作数,抛出错误“Uncaught ReferenceError: Invalid left-hand side expression in postfix operation”。......
2023-11-08
常量是在程序中其值不能改变的量。C++支持4种类型的常量:整型、浮点型、字符型和枚举型。如以下浮点数是合法的:3.14159F0.121.0E-32.f3.字符常量与字符串常量C++中的字符常量常用单引号括起,如'3'、'b'和''分别表示字符3、字符b和空白字符。表1.2常用的特殊字符当0个或多个字符由双引号""括起时,就组成字符串常量。......
2023-11-07
二审与再审调解率的快速上升,已经严重危及我国司法制度的根基。欲纠正此种背离司法基本规律的行为,最理想的办法莫过于严厉禁止调解在二审与再审中的适用。现实可行的办法是,按照司法的克制性原则,严格限制调解在二审与再审案件中的适用。在二审与再审过程中,对于当事人没有提出请求的,法官不得主动要求当事人调解或者为当事人提出调解方案。......
2023-08-06
和构造函数一样,析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用,其顺序与执行构造函数时的顺序正好相反。最后调用基类的析构函数,多个基类则按派生类声明时列出的逆序、从右到左调用,而不是初始化列表中的次序。首先执行派生类的析构函数,然后执行派生类成员对象的析构函数,再执行基类的析构函数,最后执行基类成员对象的析构函数。......
2023-11-07
内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。声明虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确地执行。如果不相同,则被派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。......
2023-11-07
同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。程序的一次执行如下:填充一个字符数组第1个数据:a↙第2个数据:b↙第3个数据:c↙第4个数据:d↙第5个数据:e↙数组的内容是:a b c d e填充一个双精度数组第1个数据:1.2↙第2个数据:5.6↙第3个数据:3.1↙数组的内容是:1.25.63.1图5.3类模板、模板类和对象之间的关系......
2023-11-07
类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。在类模板中,可以用类型参数名表示数据成员的类型,也可以表示成员函数返回值、形参和局部变量的类型。类模板定义中的类型参数可带默认值。说明以下类模板的功能。......
2023-11-07
相关推荐