设想一个函数GetInformation用来获取用户信息。
main函数调用并处理这些信息。
注意:后文中tuple,pair,get等都是std中的
1. 传引用
main函数中创建这些变量,而该函数并不需要额外的空间。使用引用的参数直接修改相关变量,速度上也很优。
void GetInformation(string& name, int& age){
cin>>name>>age;
}
int main(){
string name;
int age;
GetInformation(name, age);
cout<< name<< " "<< age<< endl;
}
2. 传指针
传引用不好的点在于无法判断该参数是不是一个有效变量,传指针可以加入空指针判断,更安全。另外,如果不需要某些变量的时候,可以直接将其传入nullptr,在函数中只对非nullptr的值进行操作即可。
bool GetInformation(string* name, int* age){
if (name && age){
cin>>*name>>*age;
return true;
}
else{
return false;
}
}
int main(){
string name;
int age;
// GetInformation(&name, &age);
auto flag = GetInformation(nullptr, &age);
if (flag)
cout<< name<< " "<< age<< endl;
else
cout<< "something wrong"<<endl;
}
3. tuple,pair
tuple可以返回多个值,只要声明即可;pair只能是两个值。
tuple获得值的方式是get<>(),用索引获取对应值;pair用.first和.second即可。
但他们的坏处是不利于理解,还要去反推索引对应的是什么变量。
// tuple<string, int> GetInformation(){
pair<string, int>GetInformation(){
string name;
int age;
cin>>name>>age;
// return make_tuple(name, age);
return make_pair(name, age);
}
int main(){
string name;
int age;
auto info = GetInformation();
// cout<< get<0>(info)<< " "<< get<1>(info)<<endl;
cout<< info.first << " "<< info.second<<endl;
}
4.结构体
在结构体中添加所有需要的返回值,然后将函数的返回值设置为该结构体类型。好处是可以自由添加变量个数与类型;取值的时候可以直接指定变量,易读;返回值书写也很简洁。
struct Person{
string name;
int age;
float height;
};
Person GetInformation(){
string name;
int age;
float height;
cin>>name>>age>>height;
return {name, age, height};
}
int main(){
auto info = GetInformation();
cout<< info.name<< " "<< info.age<< " "<< info.height<< endl;
}