区分成员函数、非成员函数、友元函数

转载 2005年03月04日 13:24:00

成员函数与非成员函数最大的差异是,成员函数可以是虚拟函数,而非成员函数不可以。所以如果你有一个函数需要动态绑定(直到执行时期再确定应该调用哪一个函数),你必须用虚拟函数,而此虚拟函数必须是成员函数。

假设f是想正确声明的函数,C是和它相关的类,有如下原则:

a、虚函数必须是成员函数。如果f必须是虚函数,就让它成为C的成员函数。

boperator>>operator<<决不能是成员函数。如果foperator>>operator<<,让f成为非成员函数。如果f还需要访问C的非公有成员,让f成为C的友元函数。

c、只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问C的非公有成员,让f成为C的友元函数。

d、其它情况下都声明为成员函数。如果以上情况都不是,让f成为C的成员函数。

如果运算符被重载为非成员函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。

 

如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个右侧参数,因为对象自己成了左侧参数。

 

下面的例子*运算符只能用其一:

 

class Rational ///表现分数的类

 

{

 

    ///分子的乘法,当为友元函数;
    friend const Rational operator*(const Rational& lsh,
    const Rational rhs)
    {

 

//取用了Rationalprivate变量;

 

         return Rational(lsh.numerator * rhs.numerator,

 

                        rsh.denominator * rhs.denominator)
    }

 

public:
    
Ration(int numerator = 0,int denominator =1)
    //当为成员函数;
    
Const Rational operator*(const Rational& rhs) const
Private:
    
Int numerator;//分子
    
Int denominator;//分母

 

}

 

rational onehalf(1, 2);

rational result

result = onehalf * 2;      // 运行良好

 

result = 2 * onehalf;      // 出错!因为是成员函数,左边参数不支持隐形转换。

 

当其变成非成员函数时:

 

//当为非成员函数;

 

const Rational operator*(const Rational& lsh,const Rational rhs)

 

{

 

}

 

rational onehalf(1, 2);

rational result

result = onehalf * 2;      // 运行良好

 

result = 2 * onehalf;      //运行良好,因为是非成员函数,左边参数支持隐形转换。

 

当为friend函数(最好少用):

rational onehalf(1, 2);

rational result

result = onehalf * 2;        // 运行良好

 

result = 2 * onehalf;      //运行良好,因为是非成员函数,左边参数支持隐形转换,且可取用Rational中的private变量。

相关文章推荐

项目1-2 请用类的友元函数,而不是成员函数,再次完成上面提及的运算符的重载;

12

十七、运算符重载(一) 成员函数重载、友元函数重载、运算符重载规则

一、运算符重载         运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象,这样我们在用自己的数据类型进行运算时,写出的代码更直观易读。比如我们定义了了复数类Com...

C++运算符重载 成员函数与友元函数

#include using namespace std; class A {     int x,y;     public:     A(int xx,int yy):x(xx),...

C++运算符重载形式——成员函数or友元函数

运算符重载是C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。 运算符重载的我们需要坚持四项基本原则:  (1)不...

从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载

一、运算符重载 运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数...

友元(友元函数、友元类和友元成员函数) C++

有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。 友元(frend)机制允许一个类将...

如何实现在多文件下一个类的友元函数是另一个类的成员函数

这是我作业中的一题,我按照正常的逻辑做是这样 下面是我的代码//main.cpp #include"CTime.h" #include"CDate.h" #include void main() { ...

成员函数重载运算符和友元函数重载运算符的比较

1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。   对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运...

从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载

一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性运算符重载仅仅只是语法上的方便,它是另一种函数...

C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex

题目要求如下: 1) 基本的构造函数; 2) 成员运算符+、-实现复数的加减运算; 3) 友元运算符+、-实现更合理的加减运算; 4) 运算符<>实现复数类的输出输入。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)