c++ - C++ 中函数参数作为 (const int &) 和 (int & a) 的区别

标签 c++ function reference argument-passing

我知道如果你写 void function_name(int& a),那么函数将不会对作为参数传递的变量进行本地复制。在文献中也遇到过你应该写 void function_name(const int & a) 以便编译器说我不希望作为参数传递的变量被复制。

所以我的问题是:这两种情况有什么区别(除了“const”确保传递的变量不会被函数更改!!!)???

最佳答案

当你不需要写的时候,你应该在签名中使用const。将 const 添加到签名有两个作用:它告诉编译器您希望它检查并保证您不会在函数内部更改该参数。第二个效果是使外部代码能够使用您的函数传递对象,这些对象本身是常量(和临时对象),从而可以更多地使用同一函数。

同时,const 关键字是您的函数/方法文档的重要组成部分:函数签名明确说明了您打算对参数做什么,以及它是否是将属于另一个对象的不变量的对象传递到您的函数中是安全的:您是明确的,因为您不会弄乱他们的对象。

使用 const 在您的代码(函数)中强制执行一组更严格的要求:您不能修改对象,但同时对调用者的限制更少,使您的代码更可重用.

void printr( int & i ) { std::cout << i << std::endl; }
void printcr( const int & i ) { std::cout << i << std::endl; }
int main() {
   int x = 10;
   const int y = 15;
   printr( x );
   //printr( y ); // passing y as non-const reference discards qualifiers
   //printr( 5 ); // cannot bind a non-const reference to a temporary
   printcr( x ); printcr( y ); printcr( 5 ); // all valid 
}

关于c++ - C++ 中函数参数作为 (const int &) 和 (int & a) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2727402/

相关文章:

c++ - char**& 参数混淆

c++ - 关于 C++ 中的内存

c++ - 为 vector 分配内存

c++ - 加载 DLL 在编译 C++、Visual Studio 时不起作用

c++ - 使用 C++ 和 QML 的 Qt 应用程序

javascript - 在文本区域中输入时禁用 javascript 功能

.net - 是否可以在 C++ .NET 中使用匿名函数?

javascript - 在函数定义中添加 array = [ ] 时出现意外效果

c++ - C++ 中的高效 vector 运算符/对临时对象的引用

c++ - vector 元素的引用地址与其指向的 vector 元素具有不同的地址。为什么?