关于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仍然引用和指向了原来的那个常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值