c++中对const关键字的理解

一、使用const定义普通常量

 此时const可以悠然int, float, double等基本数据类型和string,vector。 此时定义的常量的值在程序中是不能改变的。

        如: const int ia= 5;

                                          const double pi=3.14;

                                          const string str="abc";

                                          const vector<string> vs{"hello", "World!"};

对于这种类型的常量而言, const放在类型名的后面也是可以的,即 int const ia=5;

但是一般建议使用第一种形式,因为使用第二种形式当定义指针进,会经常有些让人混淆。

如: const int *p; 与 int const *p ;的定义是一样的,但是 int * const p则会是另外一种不同解释。 这个内容在下面进行介绍,在这里我们记住使用第一种方式就行了。 即定义常量时const 在类型名的前面。


二、const 的引用

1、)

int i1=512;
double d=3.14;
const int &r1=i1;
const int &r2=d;
上面的两种写法都是正确的,我们定义的两个引用r1, r2都是指向 const int 型的引用。但是 i1, d 并不是const int型的呀。 其实,c++实现的机制会用一个临时变量来完成的。

即 执行 const int &r1=i1;时,会利用临时变量来完成,这里我们假设系统用temp来作为临时变量。

                         const int temp= i1; 

                         const int &r2=temp;

这种方式的,主要应用于函数传参时,

如我们有一个函数,我们不想函数在执行的过程进更改我们参数的值,我们可以通过传值的方式来完成。但是通过传递引用我们效率会更加的高,尤其当参数是类对象时。这时会可以把参数设置成const类型的。

 funcMax(const int & a, const int b);

 但是我们调用时,则可以用func(512,3.14)来调用。 这是因为temp临时变量的机制。

2)、

很明显 我们用 const int i1=512,; const int  i2=1024;

然后用引用 

const int &r1=i1;
const int &r2=i2;

必然是正确的呀。


3) 但是 

const int i1=4;
int &r2=d;

则是错误的。 因为此时i1是一个整型常数,我们不能非常量引用去引用一个常量。


三、 指针和const 

 1) 当我们定义了一个常量对象,我们想用一个指针指向该常量对象的地址时,则只能使用指向常量的指针(pointer to const)来完成了。

     如:

     const double pi=3.14;
     const double *pp=&pi;
2)而 
     double *ptr=&pi是错误的。

因为pi是一个常量,其地址也是一个常量。


3)、各引用一样,也可以利用临时变量的实现机制来实现下面的赋值。

double pi=3.14;
const double *pp=&pi;
pp=nullptr;
const int *ipp=&pi;
都是正确的。

这种方式也主要是应用在参数传递时,保证参数的值不被改变。即*pp, *ipp不会被改变,但是pp ,ipp的指向却是可以改变的。

我们的pp, ipp指向的是const 对象,但是 pp,ppi  本身不是const的呀,不是常量,我们怎么把pp,ipp也定义成常量那,即定义常量指针。

用const double * const pp=&pi; 就行了。

记住此时,pp也是常量啦, 其值必须初始化,其指向不能改变。 而且此时,*pp也不能改变。

因为pp定义的指向是const double 类型的。

如果想定义pp不能改变,但*pp可以改变,则可以用下面的定义方式了。

double  * const pp=&pi;

注意:引用不是对象,只是别名所以引用没用常量引用。


四、顶层const 和底层const

   在一个声明语句中,当把一个变量定义成了常量,则const就是顶层const,而声明其指向必须为一个常量时,则为底层const.

 对于  const double * const pp=&pi; 而言。 //第一个const 为底层const ,第二个const为顶层const.

顶层const和底层const 在执行对象的拷贝操作时是有区别的,即顶层const不受影响,但底层const会受影响。

如上面的 二、3)和三、2)部分都是错误的。因为左边的变量并没具备相同的底层const。

所以,当进行拷贝时,左边变量应和右值具有相同的底层const,或, 左边的变量有底层const而右边的变量不具有const(此时会利用临时变量来完成拷贝如上面提到的:二、1)和三,3)部分)。






                      


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值