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

问题描述 投票:0回答:7

我知道如果你写

void function_name(int& a)
,那么该函数将不会对作为参数传递的变量进行本地复制。在文献中也遇到过,您应该写
void function_name(const int & a)
来表示编译器,我不希望复制作为参数传递的变量。

所以我的问题:这两种情况有什么区别(除了

const
确保传递的变量不会被函数改变)?

c++ function reference parameter-passing
7个回答
11
投票

当您不需要书写时,您应该在签名中使用

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 
}

8
投票

所以我的问题:有什么区别 对于这两种情况(除了 “const”确保变量 通行证不会被更改 功能!!!)???

就是的区别。


1
投票

你说的区别是对的。您也可以将其表述为:

如果您想指定函数可以更改参数(即通过(变量)引用指定参数来实现

init_to_big_number( int& i )
。如有疑问,请指定它
const

请注意,不复制参数的好处在于性能,即对于“昂贵”的对象。对于像

int
这样的内置类型,写
void f( const int& i )
是没有意义的。传递对变量的引用与传递值一样昂贵。


1
投票

他们可以操作的参数有很大差异, 假设您的类有一个来自 int 的复制构造函数,

customeclass(const  int & count){
  //this constructor is able to create a class from 5, 
  //I mean from RValue as well as from LValue
}
customeclass( int  & count){
  //this constructor is not able to create a class from 5, 
  //I mean only from LValue
}

const 版本本质上可以对临时值进行操作,而非常量版本不能对临时值进行操作,当你错过了需要 const 的地方并使用 STL 时,你很容易会遇到问题,但你会得到奇怪的错误,告诉它找不到版本这需要暂时的。我建议尽可能使用 const。


0
投票

它们有不同的用途。使用

const int&
传递变量可确保您获得具有更好性能的传递复制语义。您可以保证被调用的函数(除非它使用
const_cast
做了一些疯狂的事情)不会在不创建副本的情况下修改您传递的参数。当函数通常有多个返回值时使用
int&
。在这种情况下,可以使用这些来保存函数的结果。


0
投票

我想说的是

void cfunction_name(const X& a);

允许我传递对临时对象的引用,如下所示

X make_X();

function_name(make_X());

同时

void function_name(X& a);

未能实现这一目标。出现以下错误 错误:从“X”类型的临时类型对“X&”类型的非常量引用进行无效初始化


0
投票

抛开性能讨论,让代码说话!

void foo(){
    const int i1 = 0;
    int i2 = 0;
    i1 = 123; //i gets red -> expression must be a modifiyble value
    i2 = 123;
}
//the following two functions are OK
void foo( int i ) {
    i = 123;
}
void foo( int & i ) {
    i = 123;
}
//in the following two functions i gets red
//already your IDE (VS) knows that i should not be changed
//and it forces you not to assign a value to i
//more over you can change the constness of one variable, in different functions
//in the function where i is defined it could be a variable
//in another function it could be constant 
void foo( const int i ) {
    i = 123; 
}
void foo( const int & i ) {
    i = 123; 
}

在需要的地方使用“const”有以下好处: * 你可以在不同的函数中改变一个变量 i 的常量 在定义 i 的函数中,它可以是一个变量 在另一个函数中它可以是常量值。 * 你的 IDE 已经知道 i 不应该被改变。 它迫使你不要给 i 赋值

问候 哎呀

© www.soinside.com 2019 - 2024. All rights reserved.