zoukankan      html  css  js  c++  java
  • 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所作的任何修改也将丢失。

     

  • 相关阅读:
    C#-创建自定义双击事件
    C#-设置button颜色
    C#-动态生成40个按钮,大小(20,20),要求每行6个放置
    推荐系统相关算法(1):SVD
    SVD在推荐系统中的应用
    个性化推荐研究(四)之如何利用用户行为数据
    推荐系统开源软件列表
    推荐系统中所使用的混合技术介绍
    协同过滤算法
    转:[大数据竞赛]算法讨论
  • 原文地址:https://www.cnblogs.com/wiessharling/p/2984513.html
Copyright © 2011-2022 走看看