• 关于const和指针的专题


          const和指针的问题是笔试里经常出现的问题。这里综合一下各种不同的情况。

          首先是几种const与指针组合的区分,比如:

    int b = 500; 
    const int* a = &b; [1] 
    int const *a = &b; [2] 
    int* const a = &b; [3] 
    const int* const a = &b; [4]

     

           [1]和[2]其实是一样的,都是指向int型常量的指针,而[3]是int型常量指针,两者的区别是指向常量的指针本身可以指向别的,所指向的数据不能被修改,而常量指针本身不能被修改。[4]就不用说了,啥都甭想改。

           至于例子,可以举下面的一个例子(以[1]为例)。这里小小的牵扯了一点优先级的问题。

    #include <iostream> 
    using namespace std;

    int main(int argc,char* argv[]) 

        int a=1; 
        const int *b=&a; 
        *b++;//成立 
        (*b)++;//编译器错误 
    }

           那么我们能不能突破const去修改一个值呢?虽然这件事情本身并没有多大意义,但是还是可以做的。我们可以用const_cast来去掉一个const或者volatile限制。const_cast的作用主要分如下三种:

    转化一个常量指针为非常量指针

    转化一个常量引用为非常量引用

    转化一个常量对象为非常量对象

          至于例子

          我们举如下一个例子:

    #include <iostream> 
    using namespace std;

    class Test 

    public: 
        const int a ; 
        Test(int b):a(b) 
        { 
        
        } 
    };

    int main(int argc,char* argv[]) 

        Test t(1); 
        //t.a=2;//出错 
        int b=const_cast<int&>(t.a); 
        int& c=const_cast<int&>(t.a); 
        int* d=const_cast<int*>(&t.a); 
        b=2; 
        c=3; 
        cout<<t.a; 
        *d=4; 
        cout<<t.a; 
        return 0; 
    }

          源码借用了一个微软今年的笔试题,当然原题只是想说明const的成员变量可以被:a(b)这种初始化方式初始化。这里主要是想说const_cast有三种转换方式,需要注意的是b其实是一个新的变量了,而c和d仍然引用和指向了原来的那个常量。

  • 相关阅读:
    微软工具连接
    [转贴]生成缩略图
    突破验证,安装Media Player11.
    【转贴】Sourcecode and Code Snippets
    AppArch(一):User Interface
    【转】中国的OA要走的路还很长
    对WebService的在企业应用中的思考。
    [转贴]按文件类型获取其图标
    信息系统分析方法
    【转】WebService第一次调用正常,第二次调用超时的解决办法。
  • 原文地址:https://www.cnblogs.com/sdqxcxh/p/2437131.html
Copyright © 2020-2023  润新知