C++中define与const的区别
2016-02-23 09:40
387 查看
如有错误,欢迎批评指正
一、二者的区别
①编译器对二者的处理方式不同
define宏是在预处理阶段进行展开,只做展开处理不做运算处理;
const常量是在编译和运行阶段使用。
②类型和安全检查不同
define宏定义是没有类型的,在预处理阶段不做任何类型安全检查;
const常量是有类型的,在编译阶段进行类型安全检查。
③存储方式不同
define宏定义是不分配内存的;
const常量定义是需要分配内存的。
④const常量可以节省空间,避免不必要的内存分配
例如:
#define SIZE 1024 ;//常量宏
const int NUM = 3; //必须进行初始化,此时分配内存,以后不再分配内存
int a = NUM; //只为变量a分配内存
int b = SIZE; //为变量b和SIZE分配内存
int c = SIZE; //为变量c和SIZE分配内存
⑤define宏可以定义函数,此时函数相当于c++中的内联函数,而const只能定义常量。
二、下面对二者的具体使用做一个详细的介绍
1、define的使用
在C++中,define的宏定义是将一个标示符定义为一个字符串,该标示符被称为宏名,字符串被称为替换文本。define宏定义有两种使用形式,一是不带参数的宏定义(简单的宏定义),另一种是带参数的宏定义。
①简单宏定义
例如:#define PI 3.1415;
在以后的程序中,使用标示符PI,就相当于使用3.1415,即完成从3.1415到PI的替换。
②带参数的宏定义
例如:#define SUM(x) x+x;
int a = SUM(3)* 4;//计算a是多少??
计算的过程如下:
将SUM(3)进行替换,即a = 3 + 3 * 4,因此a = 15,这就证明了define宏定义只做替换处理,不做运算处理。
2、const的用法
①const定义常量
例如:const int NUM = 1024;//注意,必须进行初始化
②const用于指针
例如:int a = 12;
int b = 45;
const int *pa = &a;//pa是变量,可以修改pa的值;*pa是常量,不能通过修改*pa的值来修改a
pa = &b; //是合法的语句
*pa = 4; //是非法的语句
int *const pb = &b;//pb是常量,是不能修改的;*pb是变量,可以通过修改*pb的值来修改b
pb = &a; //是非法的
*pb = 12; //是合法的
③const用于函数
当const用于修饰函数的形参时,在函数的内部是不能修改此值的:
void f(const char *str);//在函数的内部是无法修改str所指向的内容
void f (const class& ref);//在函数的内部是无法修改引用ref的所引用的变量的值
④const用于类内部
const数据成员是存在的,但并不是像我们想象的那样。const数据成员只在类的某个对象的生命周期内是常量,而对于整个类而言任然是变量。因此const数据成员不能在类声明的时候进行初始化,应在类的构造函数初始化列表中进行初始化。
例如:class A{
const int NUM= 10;//错误,不能在类声明中初始化常量
char len[NUM]; //错误,未知的NUM
}
class A {
const int NUM;
A(int num);//构造函数
}
A::A(int num):NUM(num) //初始化列表中,初始化常量
{
........
}
一、二者的区别
①编译器对二者的处理方式不同
define宏是在预处理阶段进行展开,只做展开处理不做运算处理;
const常量是在编译和运行阶段使用。
②类型和安全检查不同
define宏定义是没有类型的,在预处理阶段不做任何类型安全检查;
const常量是有类型的,在编译阶段进行类型安全检查。
③存储方式不同
define宏定义是不分配内存的;
const常量定义是需要分配内存的。
④const常量可以节省空间,避免不必要的内存分配
例如:
#define SIZE 1024 ;//常量宏
const int NUM = 3; //必须进行初始化,此时分配内存,以后不再分配内存
int a = NUM; //只为变量a分配内存
int b = SIZE; //为变量b和SIZE分配内存
int c = SIZE; //为变量c和SIZE分配内存
⑤define宏可以定义函数,此时函数相当于c++中的内联函数,而const只能定义常量。
二、下面对二者的具体使用做一个详细的介绍
1、define的使用
在C++中,define的宏定义是将一个标示符定义为一个字符串,该标示符被称为宏名,字符串被称为替换文本。define宏定义有两种使用形式,一是不带参数的宏定义(简单的宏定义),另一种是带参数的宏定义。
①简单宏定义
例如:#define PI 3.1415;
在以后的程序中,使用标示符PI,就相当于使用3.1415,即完成从3.1415到PI的替换。
②带参数的宏定义
例如:#define SUM(x) x+x;
int a = SUM(3)* 4;//计算a是多少??
计算的过程如下:
将SUM(3)进行替换,即a = 3 + 3 * 4,因此a = 15,这就证明了define宏定义只做替换处理,不做运算处理。
2、const的用法
①const定义常量
例如:const int NUM = 1024;//注意,必须进行初始化
②const用于指针
例如:int a = 12;
int b = 45;
const int *pa = &a;//pa是变量,可以修改pa的值;*pa是常量,不能通过修改*pa的值来修改a
pa = &b; //是合法的语句
*pa = 4; //是非法的语句
int *const pb = &b;//pb是常量,是不能修改的;*pb是变量,可以通过修改*pb的值来修改b
pb = &a; //是非法的
*pb = 12; //是合法的
③const用于函数
当const用于修饰函数的形参时,在函数的内部是不能修改此值的:
void f(const char *str);//在函数的内部是无法修改str所指向的内容
void f (const class& ref);//在函数的内部是无法修改引用ref的所引用的变量的值
④const用于类内部
const数据成员是存在的,但并不是像我们想象的那样。const数据成员只在类的某个对象的生命周期内是常量,而对于整个类而言任然是变量。因此const数据成员不能在类声明的时候进行初始化,应在类的构造函数初始化列表中进行初始化。
例如:class A{
const int NUM= 10;//错误,不能在类声明中初始化常量
char len[NUM]; //错误,未知的NUM
}
class A {
const int NUM;
A(int num);//构造函数
}
A::A(int num):NUM(num) //初始化列表中,初始化常量
{
........
}
相关文章推荐
- C语言中 time函数和difftime函数
- C/C++基础——inline 与 宏
- c语言基础学习
- C/C++关键字 typedef 的使用说明
- C++静态库与动态库
- C++语言-01-简介
- iOS开发-OC、C、C++ 混编
- C语言 getopt()函数的使用
- C++11中新特性之:unordered_map
- C++ Template Class List
- C++学习笔记3
- UVALive 5873 - Tree Inspections 【模拟】
- UVALive 5878 - Shortest Leash 【计算几何】
- C语言知识点汇总(未完成)
- UVALive 5876 - Writings on the Wall 【KMP】
- VC++的一个奇怪的C2732错误
- UVALive 5870 - Smooth Visualization
- 2016年2月23号工作日记
- 查找单链表倒数第k个元素
- 【C语言】17-预处理指令3-文件包含