详解C++编程中的主表达式与后缀表达式编写基础

2020-01-06 14:22:54丽君


void Func( int i ); // Function prototype
...
Func( 7 );     // Execute function call

调用前的概念性初始化为:


int Temp_i = 7;
Func( Temp_i );

请注意,初始化就像使用等号语法(而不是括号语法)一样执行。 在将值传递到函数之前制作了 i 的副本。
因此,如果函数原型(声明)对 long 类型的参数进行调用,并且调用程序提供了 int 类型的实参,则会使用到 long 类型的标准类型转换提升该实参。
如果提供了一个实参,但它没有到形参的类型的标准的或用户定义的转换,则是一个错误。
对于类类型的实参,将通过调用类的构造函数初始化形参。 
执行函数调用。
以下程序片段演示了函数调用:


// expre_Formal_and_Actual_Arguments.cpp
void func( long param1, double param2 );

int main()
{
  long i = 1;
  double j = 2;

  // Call func with actual arguments i and j.
  func( i, j );
}

// Define func with formal parameters param1 and param2.
void func( long param1, double param2 )
{
}

当从 main 调用 func 时,将使用 param1(i 将转换为类型 ilong 以对应使用标准转换的正确类型)的值初始化形参 ,并使用 param2(j 将转换为使用标准转换的类型 jdouble)的值初始化形参 。
参数类型的处理
不能在函数主题内更改声明为 const 类型的形参。 函数可以更改类型不是 const 的任何参数。 但是,更改对于函数而言是本地进行的,且不会影响实参的值,除非实参是对非 const 类型的对象的引用。
以下函数阐释了其中的一些概念:


// expre_Treatment_of_Argument_Types.cpp
int func1( const int i, int j, char *c ) {
  i = 7;  // C3892 i is const.
  j = i;  // value of j is lost at return
  *c = 'a' + j;  // changes value of c in calling function
  return i;
}

double& func2( double& d, const char *c ) {
  d = 14.387;  // changes value of d in calling function.
  *c = 'a';  // C3892 c is a pointer to a const object.
  return d;
}

省略号和默认参数
通过使用下列两种方法之一,可以声明函数以接受比函数定义中指定的参数更少的参数:省略号 (...) 或默认参数。
省略号表示可能需要参数,但声明中未指定数目和类型。 这通常是较差的 C++ 编程做法,因为它使您无法获得 C++ 的一个优点,即类型安全。 不同的转换将应用于使用省略号声明的函数,而不是应用于那些已知其形参和实参类型的函数:
如果实参的类型为浮点,则在函数调用前将其提升为双精度类型。