5.2.2 函数调用

来源:互联网 发布:阿玛拉王国 身材数据 编辑:程序博客网 时间:2024/05/22 22:30

5.2.2 函数调用

1、存在两类函数调用:普通函数调用和成员函数(9.3[注:静态成员函数(9.4)为普通函数。]调用。函数调用是一个后跟圆括号的后缀表达式,其中圆括号内或者为空,或者是通过逗号分隔的表达式列表,这个表达式列表组成了函数的参量。对于普通函数调用来说,后缀表达式或者是一个引用函数的左值(在这种情况下,不对后缀表达式进行函数-指针标准转换(4.3)),或者是一个指向函数类型的指针。如果函数通过具有语言链接属性的函数类型的表达式调用,当此语言链接属性与被调用函数的函数类型的语言链接属性不同时,函数的调用行为是未定义的(7.5)。对于成员函数调用来说,后缀表达式应该为隐式或显式的类成员访问(5.2.5),其中的id-expression应该是一个函数成员名,或者是一个用于选择函数成员的成员指针表达式(5.5)。后缀表达式中的第一个表达式被称为对象表达式,调用则被看成是对象所指向或引用的成员。在隐式类成员访问的情况下,隐式对象是指this指针所指向的对象。[注:形式为f()的成员函数调用被解释为(*this).f()(参见9.3.1)。]当使用一个函数或成员函数名时,这个名字可能被重载了(第13章),在这种情况下必须根据13.3的规则选择一个合适的函数。在成员函数中调用的函数通常根据对象表达式(第10章)的静态类型进行选择,但当函数为虚并且没用使用限定标识符说明时,实际被调用的函数是所选函数在对象表达式的动态类型中的最后覆盖版本。[注:动态类型是通过对象表达式的当前值所指向或引用的对象类型。12.7讨论了当对象表达式所引用的对象处于构造函数和虚构函数中时的虚函数调用行为。]

2、如果被调用函数的声明不可见,也就是说在当前作用域调用了一个声明不可见的函数,程序是非法的。

3、函数调用表达式的类型为被静态选取的函数的返回类型(也就是说,忽略virtual关键字),即使它与实际所调用函数的类型不同。函数调用表达式的类型必须为完全对象类型、引用类型或空类型。

4、函数被调用的时候,每一个参数(8.3.5)都必须通过与其对应的参量初始化(8.5, 12.8, 12.1)。如果函数为非静态成员函数,函数的“this”参数(9.3.2)必须初始化为指向调用对象的指针,就像通过显式类型转换(5.4)一样(乍看起来,后一句好像是多余的,其实不然。比如,在派生类对象中调用基类成员函数时,需要把this从派生类对象指针转换为基类对象指针)。[注:在这种转换中不进行访问检测;访问检测通常(可能是隐式地)作为类成员访问算子的一部分。参见11.2]当函数被调用时,如果某个(些)参数具有对象类型,应保证此对象类型已被完全定义。[注:指针或引用参数仍允许使用不完全类类型。然而,传值参数不能为不完全类类型。]在参数的初始化过程中,编译器可将相关参量的转换和(或)临时变量的构造同参数的初始化(参见12.2)结合在一起,以避免构造额外的临时变量。当函数返回时,参数的生命期也宣告结束。每个参数的初始化和销毁都发生在调用函数(不是被调用函数)的上下文中。[例如:构造函数、转换函数和析构函数的访问在调用函数的调用点进行检测。如果函数参数的构造函数或析构函数抛出异常,从调用函数的作用域开始搜索异常处理器;特别的,即使被调用函数包含function-try-block(第15章),并且具有能处理此异常的异常处理器,这个异常处理器也不会被搜索。]函数调用的值为被调用函数的返回值,对于最后覆盖版本的返回类型不同于被静态选取的函数返回类型的虚函数调用除外,这个时候从最后覆盖版本返回的值将被转换为被静态选取的函数的返回类型。

5[注:函数可改变非const参数的值,但这种改变并不影响传入参量的值,除非参数为引用类型(8.3.2);如果引用是一个常量限定的类型,那么在修改参量值之前,需要使用const_cast以强制去除对象的常量限定属性。当参数为常值引用类型,必要的时候会引入一个临时对象(7.1.5, 2.13, 2.13.4, 8.3.4, 12.2)。此外,还可通过指针参数改变非常量对象的值。]

6、函数可被声明为接受比函数定义(8.4)中的参数数量更少(通过声明缺省参量(8.3.6))或更多(使用省略号,…8.3.5)的参量。[注:这意味着,除非使用省略号(),否则每个参量都对应着一个参数。]

7、当给定的参量没有对应的参数时,参量通过如下方式传递:接收函数调用va_arg18.7)获取参量的值。对参量表达式须进行左值-右值(4.1)、数组-指针(4.2)、函数-指针(4.3)标准转换。如果在这些转换完成之后,参量不具有算术、枚举、指针、成员指针或类类型,程序是不合法的(引用类型呢?)。如果参量为非POD类类型(第9章),程序的行为是未定义的。如果参量为能进行整型提升(4.5)的整数或枚举类型,或能进行符点提升(4.6)的符点类型,参量的值在调用之前被转换为提升类型。这些提升被称为缺省参量提升

8、参量的计算次序是不定的。在进入函数之前,参量表达式计算的所有副作用均已生效。先机算后缀表达式还是先计算参量表达式列表也是不定的。

9、递归调用是允许的,但不能对main3.6.1)函数进行递归调用。

10、当且仅当返回类型为引用时,函数调用才为左值。