之前说, 实参和形参的关系: 实参是形参的初始值, 而形参的初始化, 和普通变量的初始化无异:
#include <iostream>
using namespace std;
int fact(int val)
{
int ret = 1;
while (val > 1)
{
ret*=val;
val--;
}
return ret;
}
int main()
{
cout<<fact(5);
}
这里fact(5)的调用相当是:
int val = 5; // 执行函数第一步: 定义并初始化形参
int ret = 1;
while(val>1)
ret*=val--;
int j = ret; // 用ret的副本初始化j
这样的话, 看我们熟悉的以下情况:
int i = 42;
const int* cp=&i; // 正确: 常量指针可以绑定到常量对象
const int& r=i; // 正确: 常量引用可以绑定到常量对象
const int& r2 = 42; // 正确: 常量引用可以绑定到字面值
int*p = cp; // 错误: 类型不匹配, 不能将常量指针赋值给普通指针
int &r3 = r; // 错误: 不能将常量引用绑定到非常量对象
int& r4 = 42; // 错误: 不能将常量引用绑定到非常量对象
同样, 对于指针引用的形参const, 我们想象出用实参位形参赋值的过程, 那么分析方法和上面一致.