1、const基础知识(用法、含义、好处)

int main()
{const int a;   //a为const,常数型数int const b;  //b为const,常数型数const int *c;  //c为const,指向长整型数的指针(所指向的内存数据不能修改,但本身可以修改)int *const d;  //int*为const,常量指针(指针变量不能被修改,但是它所指向内存空间可以被修改)const int * const e;  //int*为const;e为const,指向常整形的常指针(指针和它所指向的内存空间,都不能被修改)return 0;
}

const在 * 左边,变量为const;

const在 * 右边,指针为const.

int func1(const)

初级理解:const是定义常量==》const意味着只读

const好处

//合理的利用const

1、指针做函数参数,可以有效的提高代码的可读性,减少bug.

2、清楚的分清参数的输入和输出特性

int setTeacher_err(const Teacher *p);

const修改形参的时候,在利用形参不能修改指针所指向 的内存空间

2、C中的“冒牌货”

//c语言中的const是一个冒牌货,可以被指针间接修改

//c++中const是一个真正的常量,不能被修改

int main()
{//好像a是一个常量,但其实不是const int a=10;int *p=(int *)&a;printf("a=%d\n",a);*p=11;//间接赋值,c语言会赋值成功,c++赋值不成功printf("a=%d\n",a);return 0;
} 

c的结果:

  a=10

  a=11

c++的结果:

  a=10

  a=10

解释:

c++编译器对const常量的处理:

当碰见常量声明时,在符号表中放入常量 ==》 问题,如何解释取地址?

  编译过程中若发现使用常量则直接以符号表中的值替换。

  编译过程中若发现对const使用了extern或者&操作符,则给对应的常量和分配存储空间(兼容C)

联想:下面的等式是否成立?

int &a = 1(err) & const int &a = 10

注意:c++编译器虽然可能为const常量分配空间但不会使用器存储空间中的值。

结论:

C语言中的const变量

  c语言中的const变量是只读变量,有自己的存储空间。

C++中的const常量

  可能分配存储空间,也可能不分配存储空间

  当const常量为全局,并且需要在其他文件中使用,会分配存储空间。

  当使用&操作符取const常量的地址时,会分配存储空间。

  当const int &a=10;const 修饰引用时,也会分配存储空间。

 

3、const在C和C++中的含义(笔试热点):

⑴C中的const,功能比较单一,较容易理解:
作用:被修饰的内容不可更改。
使用场合:修饰变量,函数参数,返回值等。(c++中应用场合要丰富的多)
特点: 是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const,可以只定义而不初始化,而在运行时初始化。如 const int iConst;。 另外,在c中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲突,编译时报错。

⑵c++中的const:

a、非类成员const:

①const变量默认是内部连接的,因此在不同的编译单元中可以有同名的const 变量定义。

②编译时常量,因此可以像#define一样使用,而且因为上面一点,可以在头文件中定义const变量,包含的不同的cpp文件(编译单元)中使用而不引起命名冲突。

③编译器默认不为const变量分配内存,除非:1. 使用 extern 申明, 2:程序中有引用const 变量的地址。

④c++中临时对象/内置变量默认具有const属性。

b、类中的const:

与c语言中的const一样,只是运行时常量,不能作为数组维数使用,即不能取代#define

 在类中使用下面两种方式取代#define:

  1:static const...

  2 : enum{....}//enum 不占存储空间。

类中的const 变量占用存储空间

③类中的const成员变量需要在构造函数初始化列表中初始化

④const 对象:在该对象生命周期内,必须保证没有任何成员变量被改变const对象只能调用const成员函数

const成员函数: void fun() const ... 不仅能被const对象调用,也能被非const对象调用,因此,如果确认一个任何成员函数不改变任何成员变量,应该习惯性将该函数定义成const类型。

⑥如果一个对象被定义成const,那么该const对象“可能”会被放入到ROM当中,这在嵌入式开发当中有时非常重要。

 4、const和#define的区别

 const分配内存的时机,是编译器编译期间,与#define相同

C++中的const常量类似于宏定义#define

  const int c=5  等价于 #define c 5

1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。

2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查

注意:尽量以const替换#define

5、类成员中的const变量

> 类中的const成员变量都要放在初始化列表之中进行
  > const数据成员
  > 引用数据成员
  > 对象数据成员(内置类)

  const成员函数
  > void print() const => const 类名 * const this
  > 在其内部是不能修改数据成员
  > 也不能调用非const成员函数
  > const对象只能调用const成员函数,必须要提供一个const版本的成员函数

再深入探讨类的const成员和成员函数,参考:https://www.cnblogs.com/cthon/p/9178701.html

补充:

> 类中的static数据成员需要在类之外进行初始化

  > 被类或类创建的对象共享
  > 全局/静态区

  静态成员函数
  > 它的形参列表之中没有隐含的this指针
  > 不能调用非静态的数据成员
  > 不能调用非静态的成员函数
  > 只能调用静态的成员
  > 可以直接通过类名调用
再深入探讨类的static成员和成员函数,参考:https://www.cnblogs.com/cthon/p/9178527.html

转载于:https://www.cnblogs.com/cthon/p/9166715.html

C/C++的const区别相关推荐

  1. const int 和INT const区别

    const int 和INT const区别 2010-04-09 23:26 const int a = 5; int const b = 6; 没区别 指针的时候有区别,引用也有区别 指针的话 1 ...

  2. JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)

    JavaScript重难点解析1(数据类型) var.let.const区别: 类型补充 "==="."typeof"."instanceof&quo ...

  3. javasript中var、let和const区别

    let和const都是es5,es6新版本的js语言规范出来的定义,在这以前定义一个变量只能用var.let和const都是为了弥补var的一些缺陷而新设计出来的. 简单来说是: let是修复了var ...

  4. var、let 及 const 区别

    var console.log(a) // undefinedvar a = 1 从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是 ...

  5. readonly 与 const 区别

    今天遇到一道面试题,const和readonly区别,我答得有些糊涂,在msdn上查找了下,msdn解释如下: readonly 关键字与 const 关键字不同.const 字段只能在该字段的声明中 ...

  6. int const, const int *,int *const,int const *const 区别

    今天做了一个题,关于这个问题. const int a =1 / int const a=1 变量a的值不能改变 const int *a=&b 指针变量a指向的值不能改变 int * con ...

  7. C++中const int*, const int * const, 和 int const *区别

    简介: 本文主要介绍C/C++中,const int*, const int * const, 和 int const *用法的区别,以及相关的示例代码. 1.const int, const int ...

  8. JavaScript 中 var 、let、const区别

    问题 var . let. const 都可以用来声明变量,那么它们的区别是什么? 思考思路 变量的数据类型(数字,字符串,数组 and so on) 变量的作用域 ( 全局 or 局部 or 某个代 ...

  9. C++ Primer笔记——顶层const和底层const区别

    顶层const和底层const的区别 书中的定义: 顶层const(top-level const):表示指针本身是个常量. 底层const(low-level const):表示指针所指的对象是一个 ...

最新文章

  1. 你不知道的18个Python高效编程技巧
  2. Java Web之POI操作Excel2016模板
  3. 转:马云语录之公司请你来干嘛
  4. 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?
  5. linux系统电脑白屏,在Deepin Linux 15.7系统中换桌面后关机界面白屏的解决
  6. 产品研发过程管理专题——产品需求分析原则二
  7. 箱线图怎么看_K线的48种不同类型全解(建议收藏),教你怎么看懂K线图
  8. FFmpeg合并ts文件为mp4文件
  9. 数据库原理知识点总结一
  10. 计算机cpu intel,intel CPU后面带F是什么意思?Intel处理器后面带“F”含义详解
  11. OpenGL中相关函数的意义及用法
  12. 住房教育当从娃娃抓起
  13. 学猫叫用计算机歌词,抖音学猫叫是什么歌 学猫叫歌曲歌词
  14. 高德地图 scale
  15. 应付款与分工之利读后感
  16. Git扩展工具--GitExtension的安装和配置--2021-8-22
  17. 国外6个最好的广告联盟营销推荐
  18. 我想请你,书写新世界!
  19. 关于一些七七八八整理
  20. 2023CUPT第四题彩色线思路与解法

热门文章

  1. C# Property机制
  2. android 富文本编辑器_富文本编辑器,还是Tinymce好一点?Angular/Vue集成最新版
  3. Beetl学习(一)
  4. MyBlog前端开发
  5. kotlin和python哪个好_python替代品for一些java及kotlin功能(慎入啊慎入)
  6. 第1章 Ext JS开发基本环境准备与项目创建[3/4]
  7. [Perforce系列—] 1. 使用Perforce 命令 与常用命令
  8. JS, CSS 文件压缩与反压缩工具
  9. 使用Oracle SQL Developer 编写运行 PL/SQL 块
  10. win2003安装邮箱服务器,windows2003邮件服务器