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

时间:2010-04-28 07:03:12

标签: c++ function reference argument-passing

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

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

7 个答案:

答案 0 :(得分: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 
}

答案 1 :(得分:7)

  

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

的区别。

答案 2 :(得分:1)

你说的差异是正确的。您也可以将其表述为:

如果要指定该函数可以更改参数(即init_to_big_number( int& i ),方法是通过(变量)引用指定参数。如有疑问,请指定const }。

请注意,不复制参数的好处在于性能,即“昂贵”对象。对于像int这样的内置类型,编写void f( const int& i )是没有意义的。传递对变量的引用与传递值一样昂贵。

答案 3 :(得分: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。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我会说那个

void cfunction_name(const X& a);

允许我按如下方式传递对临时对象的引用

X make_X();

function_name(make_X());

虽然

void function_name(X& a);

未能实现这一目标。出现以下错误 错误:“X&amp;”类型的非const引用的初始化无效来自临时的'X'

答案 6 :(得分: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赋值。

问候 糟糕