zoukankan      html  css  js  c++  java
  • const的用法

    <span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"><strong>1)  声明及初始化const常量。</strong></span>
    <pre class="objc" name="code">1 const int constvar;         //error2 
    const int constvar = 10;    //ok
    <p>但是,有一个例外的情况,就是<span style="color:#ff0000;">extern</span>进来的const常量不需要初始化(如果该常量其他地方确实有出现,这时将它extern进来并且初始化反而会出错)。</p><pre class="objc" name="code">1 extern const int externvar;

    2)  指针。

    对于指针变量有以下四种情况(这四句是不完整的,其中有些必须在声明时进行初始化,否则会出错,故未写分号):

    a int *ptr1b 
    const int *ptr2c 
    int *const ptr3d 
    const int *const ptr4

    a)  指向非const对象的指针。

    试图将非const对象的指针指向一个常量对象将引起编译错误,即下面的语句将不能通过编译。

    1 int *ptr1 = &constvar;      //error

    原因很简单。如果可以编译成功,我们则可以通过类似*ptr1=100这样的语句修改constvar常量的值(由于编译器不能跟踪指针在程序中任意一点指向的对象是否为常量,所以是可以赋值成功的)。这样一来就不能称之为常量了。

    b)  指向const对象的指针。

    与a做对比,此时由于ptr2指向的是一个const常量,所以就可以将它赋值为const常量的地址了。

    1 const int *ptr2 = &constvar;    //ok

    此时,由于ptr2指向的对象是常量,所以不能通过指针修改常量的值。但是,由于指针本身不是常量,所以可以修改指针,令其指向其他常量,甚至可以令其为0。

     *ptr2 = 100;                     //error 
    const int constvar2 = 100;        
     ptr2 = &constvar2;               //ok 
    ptr2 = 0;                        //ok

    另外,也可以令ptr2指向一个变量(非常量),但是也同样,不能通过指针修改变量的值,如下:

     int nonconst = 1000;
     ptr2 = &nonconst;             //ok
     *ptr2 = 10000;                //error

    c)  const指针,指向const或非const对象。

    声明const指针时,必须同时对其进行初始化。

     int nonconst = 1000;
     int *const ptr3;                //error
     int *const ptr3 = &nonconst;    //ok

    如果,ptr3指向的是一个非const对象,可以通过ptr3修改该对象的值,但是不能修改ptr3指针本身的值,如下:

     *ptr3 = 10000;        //ok
     ptr3 = &constvar;     //error

    d)  指向const对象的const指针。

    终于最后一个了。这种指针,就是把前面的几个结合起来。声明时必须初始化,指针指向的对象以及指针本身都不能修改。

    3)  迭代器。

    const_iterator用于遍历const容器.

     const vector<int> constvector;
     vector<int>::iterator  it = constvector.begin();          //error
     vector<int>::const_iterator  it = constvector.begin();    //ok

    const_iterator保证是以只读的方式访问容器元素,不得通过迭代器修改容器元素的值。

    1 *it = 20;    //error

    4)  函数参数。

    参数传值还是传指针还是传引用的问题这里就不啰嗦了。

    当参数为引用时,如果不希望引用参数在被调用的函数内部被修改,就可以使用const修饰符修饰引用参数。

     void func(const int& var)
     {
         var = 100;        //error
     }

    用const修饰传值参数是没有任何意义的,因为传值本身就是传入一个实参的副本,并不会修改实参(刚入职时,我就犯了这个低级的错误--|)。

    5)  const成员函数。

    在有些类的成员函数中,往往会看到在参数列表的最后有一个const修饰符,形如:


    
    
    
    
    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    php字符串
    碰撞检测
    javascript倒计时
    日期
    雪花那个飘
    VBS学习笔记(2): Call造成的麻烦
    VBS学习笔记(3): Array和Collection的不同
    NotepadAutomationDemo的代码V2
    VBS学习笔记(1): Set的取舍
    SQL Server之旅:(三)Attach mdf without ldf
  • 原文地址:https://www.cnblogs.com/Rainingday/p/5947481.html
Copyright © 2011-2022 走看看