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

转载 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变量。

(JS函数与作用域)[用OOP的思想来学习JavaScript]{第6章}

-
  • 1970年01月01日 08:00

重载的操作符成员函数与非成员函数

今天看effective STL第26条条款时,发现自己之前没意识到如下的几点(看来自己的c++基础还是渣渣水平o(╯□╰)o)。 如果一个类重载操作符,当在全局域内也重载了同样的操作符,那么在调用该...
  • AQ14AQ1
  • AQ14AQ1
  • 2015-11-03 22:37:36
  • 1721

读书笔记 effective c++ Item 23 宁可使用非成员非友元函数函数也不使用成员函数

1. 非成员非友元好还是成员函数好? 想象一个表示web浏览器的类。这样一个类提供了清除下载缓存,清除URL访问历史,从系统中移除所有cookies等接口:   1 class WebBr...
  • dapangzi88
  • dapangzi88
  • 2017-03-02 20:55:29
  • 189

什么是类的成员函数和非成员函数

类有成员变量和成员函数。而函数中,不是任何一个类的成员的函数,就是非成员函数。例如: class A{ public:     void f1(){}; // 这个就是成员函数。   ...
  • u013152895
  • u013152895
  • 2015-03-23 13:10:38
  • 1838

成员函数与非成员函数的区别

今天看书关于成员函数和非成员函数被搞得晕头转向的,在群里问了一下大神们才搞懂是什么意思,其实简单来说成员函数是在类中定义的函数,而非成员函数就是普通函数,就是不是在类中定义的函数,其中非成员函数比较典...
  • GS_MY
  • GS_MY
  • 2013-04-23 15:28:59
  • 1232

C++参考——成员函数、友元函数和一般函数有区别

返回:贺老师课程教学链接【项目4-成员函数、友元函数和一般函数有区别】(1)阅读下面的程序,体会注释中的说明。//例:使用成员函数、友元函数和一般函数的区别 #include using names...
  • sxhelijian
  • sxhelijian
  • 2015-04-07 15:38:08
  • 3435

成员函数、友元函数和一般函数的区别-时间

/* *Copyright (c) 2016 *All rights reserved. *文件名称:test.cpp *作 者:史红浩 *完成日期:2016年...
  • jiaowohaohao
  • jiaowohaohao
  • 2016-05-09 12:13:55
  • 2029

使用成员函数、友元函数和一般函数的区别

#include using namespace std; class Time { public: Time(int h,int m,int s):hour(h),minute(m),se...
  • ListeningForever
  • ListeningForever
  • 2016-05-25 16:43:18
  • 1826

成员函数、友元函数和一般函数有区别

/* * 程序的版权和版本声明部分: * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:任...
  • u012369162
  • u012369162
  • 2014-04-08 18:29:44
  • 561

C++中成员函数,非成员函数和友元函数

转自:http://blog.chinaunix.net/uid-10673338-id-2936852.html 转自:http://www.cnblogs.com/carsonzhu/p/502...
  • Lee_Shuai
  • Lee_Shuai
  • 2016-11-20 11:18:06
  • 537
收藏助手
不良信息举报
您举报文章:区分成员函数、非成员函数、友元函数
举报原因:
原因补充:

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