目录
1--三种基本传递方式
① 值传递:
使用值传递时,初始值会拷贝给变量,对变量的改动不会改变初始值的值;
② 指针传递:
使用指针传递时,同样会发生拷贝操作,拷贝的内容是指针的值;拷贝之后,初始指针和拷贝指针是两个不同的指针,这两个指针都能修改所指对象的值,因此指针传递可以修改初始值;
③ 引用传递:
使用引用传递时,不会发生拷贝操作,形参相当于初始变量的一个别名,修改形参会修改初始值;
一般建议使用引用传递进行参数传递,避免不必要的拷贝花销;
当函数无须改变引用形参的值时,一般将其声明为常量引用;
2--数组形参
数组具有两个特殊的性质:不允许拷贝数组和使用数组时会将其转换为指针;因此在函数中传递一个数组时,实际上传递的是指向数组首元素的指针;
3--main函数传递参数
// 方式1
int main(int argc, char *argv[]){...}
// 方式2
int main(int argc, char **argv){...}
上述两个方式功能等价,第一个形参 argc 表示数组中字符串的数量,第二个形参 argv 表示一个数组,其元素是指向 C 风格字符串的指针;其中 argv[0] 表示程序的名称;
4--传递可变形参
C++11 新标准提供两种方法处理不同数量实参的函数,第一种是使用 initiallizer list 的标准库类型,其适用于不同数量但类型相同的实参传递;第二种是编写可变参数模板,用于处理不同数量且类型不同的实参传递;
#include <iostream>
// 打印输入的参数列表,其元素类型为 string 类型
void errorPrint(std::initializer_list<std::string> lst)
{
for(auto beg=lst.begin();beg!=lst.end();++beg){
std::cout << *beg << " ";
}
std::cout << std::endl;
}
void test()
{
std::string s1, s2;
std::cout << "Input s1: " << std::endl;
std::getline(std::cin, s1);
std::cout << "Input s2: " << std::endl;
std::getline(std::cin, s2);
if(s1 != s2){
errorPrint({"functionX", s1, s2}); // 当 s1 != s2时,将打印输入的所有参数
}
else{
errorPrint({"functionX", "okay"}); // 传入 2 个参数
}
}
int main(int argc, int *argv[]){
test();
}