Const详解

函数参数和返回值

1、传递const 如果函数参数是按值传递,可用指定的参数是const的。

void fun(const int i)
{
     i++;//error  const i means can't be change
}

当调用函数fun()时,i为原变量的副本,这个副本在函数fun内不可被修改。

2、返回const值

  对返回值来讲,如果一个函数的返回值是一个常量:

     const int f();

  这就约定了函数框架里的原变量是不会被修改。另外,因为只是按值返回的,所以这个变量被被制成副本。

对于内部类型来说,按值返回的是不是一个const,是无关紧要的,所以按值返回一个内部类型时,应该去掉const,从而不会使客户程序猿混淆。

class X{
int i;
public:
X(int ii =0);
void modify();
};


X::X(int ii)
{
i = ii;
}

void X::modify(){ i++;}

X f5() {
return X();   }

const X f6(){
   return X();  }

//pass by non-const reference
void f7(X& x) { x.modify(); } int main() { f5() = X(1);//ok f5().modify();//ok //! f7(f5()); //cause warning //cause compile time errors //! f6() = X(1); //! f6().modify(); //!f7(f6()); }

f5()返回一个非const X对象,然而f6()返回一个const X对象。仅仅是非const返回值能作为一个左值使用,因此,当按值返回一个对象时,如果不让这个对象作为一个左值使用,则使用const很重要。

临时量

有时候,在求表达式值期间,编译器必须创建临时对象。关于临时量有这样一种情况:它们自动地称为常量。通常接触不到临时对象,改变临时量是错误的,因为这些信息应该是不可得的。编译器使所有的临时量自动地称为const,这样当程序猿犯那样的错误时,会向他发出警告。

f5() 返回一个非const X对象,但在表达式:f7(f5());   中,编译器必须产生一个临时量来保存f5()的返回值,使得它能传递给f7()。

如果f7()函数的参数是按值传递的话,它能很好地工作,然后在f7()中形成那个临时量的副本,不会对临时对象X产生任何影响。

但是,如果f7()的参数是按引用传递的,这意味着它取临时对象X 的地址,因为f7()所带的参数不是按const引用传递的,所以它允许对临时对象X进行修改。但是编译器知道,一旦表达式f5()计算结束,该临时对象也会不复存在,因此,对临时对象X所作的任何修改也将丢失。

 

原文地址:https://www.cnblogs.com/wiessharling/p/2984513.html