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所作的任何修改也将丢失。

     

  • 相关阅读:
    JavaScript之函数(上)
    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)<转>
    Mac配置环境变量注意点
    netty tcp拆包
    mybatis注解方式批量插入数据
    JMX超详细解读<转>
    使用EmbeddedValueResolverAware读取配置文件内容
    线程的几种状态转换<转>
    Java线程池关闭1-shutdown和isTerminated<转>
    Maven项目编译后classes文件中没有.xml问题
  • 原文地址:https://www.cnblogs.com/wiessharling/p/2984513.html
Copyright © 2011-2022 走看看