c++传值调用,地址调用,引用调用的区别
时间: 2024-11-09 09:19:04 浏览: 18
c++禁止函数的传值调用的方法
在C++中,函数的参数传递有三种基本形式:传值、地址传递和引用传递。
1. **传值调用**(Copy Elision or Pass By Value): 当我们传递普通变量时,实际上是复制该变量的一个副本到函数内部。这意味着原变量不会改变,对函数内修改的是副本。这种方式效率较低,尤其是对于大对象或复杂结构体。
例子:
```cpp
void foo(int x) {
x = x + 1; // 只影响副本,不会改变原有变量
}
int main() {
int a = 5;
foo(a); // a仍然是5
}
```
2. **地址调用**(Pass By Address or Pass By Reference): 使用&运算符获取变量的地址,然后将地址作为参数传递。函数可以修改原始变量的值。这是通过指针(pointer)实现的。
例子:
```cpp
void foo(int &x) { // 使用引用类型,传入变量地址
x = x + 1; // 直接修改原变量
}
int main() {
int a = 5;
foo(a); // 现在a为6
}
```
3. **引用调用**(Pass By Rvalue Reference): 引用是一种别名,它实际上是对某个已经存在的对象的引用。Rvalue引用用于函数返回临时结果或者接收非可移动对象,能更高效地处理这种情况。
例子:
```cpp
void foo(std::string&& s) { // 引用折叠优化,对于临时对象效率高
std::cout << s << '\n'; // 虽然s是临时的,但这里会创建一个临时拷贝
}
int main() {
std::string temp("Hello");
foo(temp); // 输出"Hello"
}
```
阅读全文