C++常引用作为函数形参与引用作为函数形参的区别?
时间: 2024-12-23 12:17:40 浏览: 69
在C++中,使用常引用(const reference)和非常引用(reference)作为函数参数的主要区别在于它们对实参的修改能力。
**1. 常引用 (const reference)**[^1]:
常引用`int const& a`表示不会改变传入参数的原始值,它实际上创建了一个指向该参数的常量别名。当我们在函数内部对其进行操作时,实际上是操作原始变量,但不能修改它的值。如以下代码所示:
```cpp
void swap(const int &a, const int &b) {
a = b; // 不会改变原始变量,而是复制临时值
}
```
**2. 非常引用 (reference)**:
非常引用`int &a`允许函数直接修改传入参数的值。当我们调用`Swap(a, b)`时,`a`和`b`会被视为原始变量的引用,函数内的操作会对这些变量造成直接影响。例如:
```cpp
void Swap(int &a, int &b) {
a ^= b; // 直接修改a和b的值
}
```
所以,如果你不想在函数内部修改实参,应使用常引用;如果需要修改,则使用非常引用。
相关问题
c++迭代器作为函数形参
回答: 当迭代器作为函数形参时,如果在函数内改变迭代器所指向的值,会影响到外部。但是在函数内改变迭代器本身,并不会影响到外部,除非传入引用。具体代码中的例子可以看出,在test函数中,通过改变iter1所指向的值为666,会影响到main函数中iter1所指向的值。而在函数内改变iter2本身,并不会影响到main函数中的iter2的值。<em>1</em><em>2</em><em>3</em>
#### 引用[.reference_title]
- *1* *2* [学习笔记:C++ 迭代器详细说明](https://blog.csdn.net/weixin_43843155/article/details/104201945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item]
- *3* [C++迭代器作为参数传递进函数使用时的注意事项](https://blog.csdn.net/qq_39540537/article/details/108772892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item]
[ .reference_list ]
c++类作为函数形参
### C++ 类作为函数参数传递
在 C++ 中,可以将类对象通过值、指针或引用的方式传入函数。每种方式都有其特点和适用场景。
#### 通过值传递
当对象按值传递时,会创建该对象的一个副本并将其传递给函数。这种方式适用于小型对象,但对于大型对象可能会带来性能开销,因为每次调用都会复制整个对象。
```cpp
void funcByValue(A obj) {
obj.display();
}
```
此方法简单直观,但在处理复杂或大尺寸的对象时不推荐使用[^1]。
#### 通过指针传递
利用指针来传递对象能够有效避免不必要的拷贝操作,并允许修改原始对象的内容(如果是指向非`const`类型的指针)。需要注意的是,在这种情况下要确保所指向的对象在其生命周期内保持有效性。
```cpp
void funcByPointer(const A* pObj) {
if(pObj != nullptr){
pObj->display();
}
}
// 使用示例
A myObject("example");
funcByPointer(&myObject);
```
这种方法提供了灵活性的同时也增加了管理内存的责任[^2]。
#### 通过引用传递
这是最常用的方法之一,既不会造成额外的拷贝成本又能直接访问原对象的数据成员。对于常量引用还可以防止意外更改数据。
```cpp
void funcByReference(const A& refObj) {
refObj.display();
}
// 或者用于可变对象
void modifyObject(A& modifiableRef) {
// 修改modifiableRef中的属性...
}
```
上述三种方式都可以用来实现不同需求下的功能设计[^3]。
阅读全文
相关推荐

















