C++---const总结(1)const与指针&&常引用

const总结(1)const与指针&&常引用


目录

const总结(1)const与指针&&常引用

const在c/c++的区别:

c中的const:

c++中的const:

const与指针

const与一级指针

const与二级指针    

const与引用---常引用(类型名 &引用名)

 面试题:(测试分析)



  • const在c/c++的区别:

c中的const:


           ① const 定义的变量可以初始化,也可以不初始化
           ② const修饰的量不能用于左值
           ③ 不能当作常量来使用,其实const修饰的应该叫做常变量
           ④ 常变量const的编译方式,和普通变量的编译方式一样

c++中的const:

① const修饰的变量一定要初始化
           ② const定义的量叫做 常量,这是真常量,可以用其来定义数组长度
           ③ C++的常量也可以变为常变量

④ 常量const的编译方式:若初始化给出立即数, 在编译时期,拿常量的值把常量的名字替换掉若用变量初始化,将退化为常变量


  • const与指针

Const可以和指针一起使用,它们的组合情况比较复杂,可归纳为三种:指向常量的指针,常指针和指向常量的常指针。

(1) 指向常量的指针是指一个指向常量的指针变量,例如:

const char* info = “name”;          // 声明指向常量的指针

这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型的常量,初始化为info指向字符串“name”。

所以下面的一句是错误的:info [3] = ‘b’;

因为这里指针所指的数据(name)是常量,不能通过解引用来修改该数据。

然后下面这句话是允许的:info = “sex”;

因为指针本身是变量,可以指向其他的内存单元。

(2) 常指针是指把指针本身,而不是它指向的对象声明为常量,例如:

char * const info = “name”;         // 常指针

这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型数据的常指针,初始化为“name”的地址。常指针就是创建一个不能移动的固定指针(地址不能改变),但是它所指的数据是可以改变的。

所以下面的一句是错误的:info = “sex”;

因为指针本身是常量,不能指向其他的内存单元。

然后下面这句话是允许的:info [3] = ‘b’;

因为指针所指向的数据是可以通过解引用来修改的。

(3) 指向常量的常指针是指这个指针本身不能改变,它所指向的值也不能改变,声明一个指向常量的常指针,二者都要声明为const,例如:

const char * const info = “name”;

这里就是上面两种的结合了,info = “sex”和info [3] = ‘b’都是错误的。

其他说明:

  a. 常量一旦建立,在程序的任何地方都不能在修改。

  b. 与#define定义的常量不同,const定义的常量因为有自己的数据类型,这样C++编译时就会进行严格的类型检查,具有良好的编译时的检测性。

  c. 函数的参数也可以用const说明,用于保证实参在该函数内部不被改动。

const与一级指针

  在const与一级指针的结合结果有:

const int *p------(1)       指向常量的指针  *p不能改变,p指针指向可以改变

int *const p------(2)       常指针  *p可以改变,但p的指向不能改变了

int const *p------(3)       同理与(1)

const int *const p-----(4)   指向常量的常指针  ,p的指向和*p的值都不能改变

(公式重要,可以直接判断两边的类型,来确定是否可以正确)
    // int *  = const int *  err
    // const int * = int * ok

 

const与二级指针
    

(公式重要,可以直接判断两边的类型,来确定是否可以正确)
    // const int **  = int **   err
    // int ** = const int **    err
    // int * = const int *      err
    // const int * = int *      ok

    // int *const * = int**      ok
    // int ** = int *const *    err
    // int **const = int**      ok
    // int *const * = const int** err

 


  • const与引用---常引用(类型名 &引用名)

如果在声明引用是用const修饰,那么该引用就被称为常引用。常引用所引用的对象不能被更新。如果用常引用做为形参,便不会产生对实参不希望的修改。

注:在部分面试题中当无法看出具体错误时,常常将引用还原为指针来看,来以此判断是否正确


出现const的代码段中,一般出现问题,主要原因是:
1、作为左值了

eg: const int a = 10;
     a = 20;

2、把const量的地址或者引用给泄露出去了

eg: const int a = 10;
      int *p = &a; // 泄露a的地址,可能会修改a,可修改为 const int *p = &a
      int &b = a; 


 面试题:(测试分析)

请选择下面哪些代码是错误的?__A__
A.
int a = 10;               
const int *p = &a;          
int *q = p;           int *    < == >  const int *     false
B.
int a = 10;
int *const p = &a;
int *q = p;          int *       <==>   int *const    true       PS:当const右没有类型,const可以当作没有(编译器决定)
C.
int a = 10;
int *const p = &a;
int *const q = p;   int*const  <==>int *const  true
D.
int a = 10;
int *const p = &a;
const int *q = p;  const int * <==>int *const true (公式+上面PS)

请判断下面哪些代码是错误的?_ BCD___
A.
int a = 10;
int *p = &a;
int *&q = p;   int *&q=p   ==》int **q=&p     int **  <==> int **  true(先将引用转化为指针)
B.
int a = 10;
int *const p = &a;
int *&q = p;       int **<==> int * const *   false 公式
C.
int a = 10;
const int *p = &a;
int *&q = p;   int ** <==>const **  false   公式
D.
int a = 10;
int *p = &a;
const int *&q = p;  const int ** <==>int **  false 公式

请判断下面哪些代码有错误?_ ADE____
A.
int a = 10;
int *p = &a;
const int **q=&p;  const int ** <==>int ** false  公式
B.
int a = 10;
int *p = &a;
int * const *q = &p; int *const *<==>int * * (先看左边的const右边是一级指针,依据公式 成立) true
C.
int a = 10;
int *p = &a;
int **const q = &p;  int **const <==>int **  true(PS)
D.
int a = 10;
int *const p = &a; 
int **q = &p;      int ** <==>int *const* (先看右边的const,其右边为一级指针,公式) false
E.
int a = 10;
const int *p = &a;
int * const * q = &p; int *const* <==>const int **   false (先看左边的const 修饰一级指针 成立 ,但看右边的const修饰的二级指针,公式错误)
注:

小结

const右边没有类型时可以忽略const进行判断

见引用,转化为指针,进行判断

一旦const修饰二级指针,左右两边必须都有const修饰二级指针才能成立

看const修饰几级的指针,根据公式判断

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值