概述
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修饰几级的指针,根据公式判断
最后
以上就是生动电话为你收集整理的C++---const总结(1)const与指针&&常引用const总结(1)const与指针&&常引用的全部内容,希望文章能够帮你解决C++---const总结(1)const与指针&&常引用const总结(1)const与指针&&常引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复