[C++]C++函数中的参数传递
C++函数中的参数传递
在C++程序中,调用函数的时候需要向函数传入一个参数,除了空参数(void)之外,参数传递分为引用传递和值传递两种
引用传递和值传递
当形参是引用类型时,称之对应的实参被引用传递,或者函数被传引用调用。和其他引用一样,引用形参也是它绑定的对象的别名;即引用形参是它对应的实参的别名。
void reset(int &i){
i=0; //i的值会改变
}
当初始化一个非引用类型的参数时,初始值被拷贝给变量,实参的值被拷贝给形参,形参和实参是两个独立的对象。我们说这样的实参被值传递,或者函数被传值调用。
void reset(int i){
i=0; //实参i的值并不会改变
}
需要注意的是,如果传入一个指针对象,则可以通过指针来改变其指向对象的值,这在C语言中很常见,但是在C++中如果有这种需求则应该使用引用传递来实现。
void reset(int *i){
*i=0; //指针i所指向对象的值同样会改变
}
另外,在传入字面常量的时候,如果字面常量较大,最好避免拷贝操作的值传递,而使用引用传递,需要注意的是,这里的引用传递必须将形参定义为底层const,因为不能把字面值传递给非const引用形参
string::size_type find_char(string &s,char c);
//该函数第一个形参应该使用const string &s,否则编译时会出现错误
含有可变形参的函数
为了编写能处理不同数量实参的函数,C++11新标准提供了两种主要的方法:如果所有实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板,这里不作详解。
使用以下形式编写输出错误信息的函数,使其可以作用于可变数量的实参
void error_msg(initializer_list<string> i1){
for(auto beg=i1.begin();beg!=i1.end();beg++){
cout<<*beg<<" ";
}
cout<<endl;
}
形参默认初始化
某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
typedef string::size_type sz;
//在声明中定义函数实参的默认值
string screen(sz ht=24,sz wid=80,char backgrnd=' ');
string window;
window=screen(); //等价于screen(24,80,' ')
对于函数的声明来说,通常的习惯就是将其放在头文件中,并且每个函数只声明一次,但是多次声明也是允许的。但是需要注意,在给定的作用域中一个形参只能被赋予一次默认实参。
string screen(sz,sz,char='*'); //错误,重复声明