C++程序设计 01-参数传递
传值调用call-by-value
C/C++把实参复制到形参,实参的值不能被形参改变。
void editarray(vector<int> v) {
	for (auto& x : v) {		//左值引用
		x++;
	}
}
int main() {
	int n;
	vector<int> v;
	cin >> n;
	v.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	editarray(v);
	for (int i = 0; i < n; i++) {
		cout << v[i] << " ";
	}
}
5 1 2 3 4 5
1 2 3 4 5
由于C只有call-by-value,因此C用模拟的方式call-by-reference。Caller传递地址而Callee用指针指向该地址,这种模拟C++中的call-by-reference的方式可以达到改变实参的效果。
void editarray(vector<int> *v) {
	for (auto& x : *v) {
		x++;
	}
}
int main() {
	int n;
	vector<int> v;
	cin >> n;
	v.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	editarray(&v);
	for (int i = 0; i < n; i++) {
		cout << v[i] << " ";
	}
}
5 1 2 3 4 5
2 3 4 5 6
传左值引用调用call-by-lvalue-reference(传引用调用call-by-reference)
C++中使用call-by-reference,形参能够改变实参的值。
void editarray(vector<int> &v) {
	for (auto& x : v) {
		x++;
	}
}
int main() {
	int n;
	vector<int> v;
	cin >> n;
	v.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	editarray(v);
	for (int i = 0; i < n; i++) {
		cout << v[i] << " ";
	}
}
5 1 2 3 4 5
2 3 4 5 6
传对常量引用的调用call-by-reference-to-a-constant(传常量引用调用call-by-constant-reference)
适用于大的不应被函数改变且复制代价昂贵的对象。
void editarray(const vector<int> &v) {
	for (auto& x : v) {
		x++;		//error:表达式必须是可修改的左值
	}
}
int main() {
	int n;
	vector<int> v;
	cin >> n;
	v.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	editarray(v);
	for (int i = 0; i < n; i++) {
		cout << v[i] << " ";
	}
}
传右值引用调用call-by-rvalue-reference
由于右值存储的是要被销毁的临时量,表达式通过move而不是复制来实现。注意此时参数只能为右值。
vector<int> editarray(vector<int> &&v) {
	for (auto& x : v) {
		x++;
	}
	return v;
}
int main() {
	vector<int> ans = editarray({5, 4, 3});
	for (auto& x : ans) {
		cout << x << " ";
	}
}
6 5 4
参考资料
Data Structure and Algorithm Analysis in C++(Fourth Edition), Mark Allen Weiss
                    
                
                
            
        
浙公网安备 33010602011771号