文章目录
上下文
函数的形参表
void process(){
}
void process(void){
}
没有任何形参的函数可以用空形参列表或含有单个关键字void的形参来表示。
调用函数时,对于每一个实参,其类型都必须与其对应的形参类型相同,或具有可转换为该形参类型的类型。
参数传递
每次调用函数时,都会重新创建该函数所有形参,此时传递的实参将会初始化对应的形参。形参的初始化与变量的初始化一样:如果形参是非引用类型,则复制实参的值,否则它只是实参的别名。
非引用形参
非引用形参表示对应实参的局部副本。对这类形参的修改只会影响局部副本的值。
- 指针形参也是非引用形参,在函数内部修改指针指向的地址不会影响实参。但是修改指针指向的内容会同步到实参。
- const形参,限制函数内部不可修改实参的副本。
void fcn(const int i){
}
void fcn(int i){
} // error: redefines fcn(int)
值得注意的是,尽管函数的形参是const,但是编译器却将其视为形参被声明为普通的int类型。这种用法是为了支持对C语言的兼容,因为在C语言中,这两种形参的函数没有区别。
复制实参并不是在所有的情况下都适合:
- 需要在函数中改变实参值得时候;
- 以大型对象作为实参值得时候。对实际得应用来说,复制对象所付出得时间和存储空间代价往往过大;
- 当没有办法实现对象得复制时。例如qt中声明了Q_OBJECT的对象就不能进行复制和拷贝。
引用形参
与所有引用一样,引用形参直接关联到其所绑定的对象。每次调用函数,引用形参被创建并与相应的实参关联。从C语言背景转到C++的程序员可能习惯通过传递指针来实现对实参的访问。在C++中使用引用形参更加安全和更自然。
- 使用引用形参返回额外信息。函数只能返回单个值,但有些时候,不止一个内容需要返回。我们可以定义一种包含这些内容的新类型,也可以传递额外的引用实参,用以返回计算结果。
- 引用形参不可传递右值或具有需要转换的类型的对象。非const引用形参只能与完全同类型的非const对象关联。
int incr(int &val){
return ++val; }
int main()
{
short v1 = 0;
const int v2 = 42;
int v3 = incr(v1); // error
v3 = incr(v2); // error
v3 = incr(v1 + v2); // error
}
普通的非const引用形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。应该将不需要需改相应实参的形参定义为const引用,这样就可以传递常量值来调用函数。
string::size_type find_char(const string &s, char c);
find_char("hello world", 'o');
- 指向指针的引用
void ptrswap(int *&v1, int *&v2)
{
int *tmp = v2;
v2 = v1;
v1