添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
稳重的肉夹馍  ·  C# ...·  1 年前    · 
淡定的猕猴桃  ·  C# Stream篇(五) -- ...·  1 年前    · 
稳重的钥匙  ·  MS Windows ...·  1 年前    · 
绅士的拖把  ·  vue3 使用refs - ...·  1 年前    · 

const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同

define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存 。(宏定义不分配内存, 变量定义 分配内存。)

const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)const  可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从 汇编的角度 来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数 ,所以,const定义的常量在程序 运行过程 中只有一份拷贝( 因为是全局的只读变量,存在静态区 ),而 #define定义的常量在 内存 中有若干个拷贝。
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

(6) 宏替换只作替换,不做计算,不做表达式求解;

宏预编译时就替换了, 程序运行时,并不分配内存。

const 与 #define 的比较

C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:

(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。

(2)   有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

l 【规则 5-2-1 在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

5.3 常量定义规则

l 【规则 5-3-1 需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。

l 【规则 5-3-2 如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。

const  float   RADIUS = 100;

const  float   DIAMETER = RADIUS * 2;

5.4 类中的常量

有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。 const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。

不能在类声明中初始化const 数据成员 。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。

class A

const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员

int array[SIZE];       // 错误,未知的SIZE

const 数据成员的初始化只能在类构造函数的初始化表中进行,例如

class A

A(int size);       // 构造函数

const int SIZE ;

A::A(int size) : SIZE(size) // 构造函数的初始化表

A  a(100);  // 对象 a 的SIZE值为100

A  b(200);  // 对象 b 的SIZE值为200

怎样才能建立在整个类中都恒定的常量呢?别指望const 数据成员了,应该用类中的枚举常量来实现。例如

class A

enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量

int array1[SIZE1];

int array2[SIZE2];

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。sizeof(A) = 1200;其中枚举部长空间。

enum   EM { SIZE1 = 100, SIZE2 = 200}; // 枚举常量 sizeof(EM) = 4;

(1) 编译器处理方式不同  define宏是在预处理阶段展开。  const常量是编译运行阶段使用。(2) 类型和安全检查不同  define宏没有类型,不做任何类型检查,仅仅是展开。  const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。  const常量会在内存中分
之前一直没有仔细研究过 # define const 区别 ,最近由于种种原因被问及此点,完全一头雾水,于是便搜集相关资料做了如下的总结。 # define const 区别 1.类型和安全检查不同 宏定义 是字符替换,没有数据类型的 区别 ,同时这种替换没有类型安全检查,可能产生边际效应等错误; const 常量 常量 的声明,有类型 区别 ,需要在编译阶段进行类型检查 其中,边际效应是指如下错误
C语言中 const 定义 常量 和宏 常量 区别 1. const 定义 常量 2.宏 常量 3.两者 区别 (1) 编译器 处理方式不同(2) 类型和安全检查不同(3) 存储 方式不同 1. const 定义 常量 关键字 const 定义的是变量不是 常量 , 而是去改变一个变量的 存储 类,把该变量所占的内存变为只读。这就是变量的值不允许改变的常变量。该 常量 带有数据类型。编译运行的时候起作用存在类型检查。 #include <stdio.h> const int a = 1; const static int b; 编译时刻:宏-预编译 const -command+b(编译阶段)编译。 宏不会检查代码错误,只是替换,但是 const 会编译报错。 宏的好处:定义代码或字符串、方法、参数 const 不能。 坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。 const 作用:限制类型 const 仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) 被 const 修饰的变量
const 在编译速度要比# define 快很多,所以平时能用 const 尽量使用 const # define 属于 宏定义 ,在编译时优先执行 使用 const 定义的变量作数组长度时不能同时初始化数组的值,例如 #include<stdio.h> int main() const int N = 10; int num[N]={0}; return 0; 会报错error: variable-sized obj
C++可以用 const 定义 常量 ,也可以使用# define 来定义 常量 ,但是前者比后者有更多的优点: 1, const 常量 有数据类型,而宏 常量 没有数据类型, 编译器 可以对前者进行静态类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能产生意想不到的错误(边际效应) 2,有些集成化的调试工具可以对 const 常量 进行调试,但是不能对宏 常量 进行调试。 所以在C++中应尽量使用
1. const 常量 是在编译时分配内存,而# define 是在预处理时进行文本替换,不会分配内存。 2. const 常量 有类型,可以进行类型检查,而# define 没有类型,只是简单的文本替换。 3. const 常量 可以进行地址取值操作,而# define 不可以。 4. const 常量 可以在多个文件中共享,而# define 只能在定义它的文件中使用。 5. const 常量 可以进行调试,而# define 不可以。 因此,建议在定义 常量 时优先使用 const ,而不是# define 。 ### 回答2: const 常量 是C++中常用的一种数据类型。定义了 const 常量 之后,它的值不能改变,因此 const 常量 也被称为“只读变量”。 定义 const 常量 的语法格式如下: const 数据类型 常量 名 = 常量 值; 其中, const 表示定义一个 常量 ,数据类型指定了 常量 的类型, 常量 名指定了 常量 的名字, 常量 值则指定了 常量 的值。 与 const 常量 类似的是# define 宏定义 ,它们的 区别 在于前者是 编译器 处理的 常量 ,后者是预处理器处理的 常量 宏定义 不会对 常量 进行类型检查,容易出现错误,在C++中往往使用 const 常量 来代替 宏定义 const 常量 非常有用,它可以保证程序在运行过程中某些数值不被无意中修改。另外, const 常量 也可以作为参数传递给函数,这样可以避免函数中修改传入参数的值,增强程序的可读性和健壮性。在类中, const 常量 也可以用来声明成员变量,表示它的值在对象生命周期内不会改变。 总之, const 常量 是C++中非常重要的一种数据类型,它可以保证程序的安全性和稳定性,非常适合用于需要保证某些值不被随意修改的场合。 ### 回答3: let变量在JavaScript中的 区别 是什么? 在JavaScript中, const 常量 和let变量是两种常用的声明变量的方式。它们与var的不同之处在于它们在声明后具有不同的作用域和可变性。具体 区别 如下: 1. const 常量 :声明一个 常量 时,必须立即初始化 常量 的值,不能再次赋值。而且, const 声明的 常量 是块级作用域,在声明的块级别内可见。此外,如果尝试重新分配 const 常量 ,将会引发TypeError错误。 2. let变量:初始化后,let声明的变量可以更改其值。与 const 一样,let变量也是在块级别的作用域中声明的,但是它在作用域中声明的变量可以被更改赋值。 总的来说, const 常量 和let变量在声明后都可以使用块级作用域,这意味着它们在声明块级别内可见,而不是在函数级别内。但是, const 常量 以初始化值之后不能进行赋值,同时,let变量可以被重新赋值。选择 const 还是let变量,需要根据实际需求和定义变量的用途来判断。 CSDN-Ada助手: 非常感谢您分享了这篇关于字符串拆分的技术博客!我们非常期待您更多关于C++技术的分享。如果您想在技术领域更进一步,我们建议您写一篇关于C++正则表达式的博客。正则表达式是一个非常强大的工具,它可以帮助我们在字符串处理中更快捷、更高效地解决问题,相信会对广大技术爱好者有所帮助。期待您的更多精彩分享! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 const常量与define宏定义的区别 tianyazhichiC: 如果先定义const常量,然后用const常量多次定义宏定义,会不会节省空间呢?? [code=csharp]const uint8_t INIT = 1; const uint8_t CHECK = 2; const uint8_t CONFIRM = 3; #define TASK1_STEP_INIT INIT #define TASK1_STEP_CHECK CHECK #define TASK1_STEP_CONFIRM CONFIRM #define TASK2_STEP_INIT INIT #define TASK2_STEP_CHECK CHECK #define TASK2_STEP_CONFIRM CONFIRM [/code] JAVA中 成员变量和和实例变量一样吗 丿半壶秋水: 成员变量包含实例变量和静态变量(也就是类变量) 进程间的通信(二)命名管道fifo m0_69669197: 请问我想在输出端出现空格应该怎么做? 八进制数的表达方法!八进制数在转义符中的使用! Yotsuki123: 二进制有什么表达方法?会不会跟其他进制搞混