定义只读变量,即常量
1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态存储区。
2)处理阶段不同,#define定义的宏变量在预处理时进行替换,const所定义的变量在编译时确定其值
3)宏定义只是做简单的替换。而const定义需要检查类型安全。
4)当定义局部变量时,const所定义的变量的作用域,仅限于const定义所在的函数段;而使用宏定义#define,是从定义点到整个程序的结束。
5)#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址
6)#define可以定义简单的函数,const不可以定义函数
2、const修饰指针型变量
//1.
//指针pString1指向的字符串不可修改。
//指针pString1的内容可以修改。
const char *pString1 = pTmp;
pString1[1] = 'd'; //报错
pString1 = pAnother; //合法
//2.
//指针pString3指向的字符串可修改。
//指针pString3的内容不可修改。指针pString3必须初始化。
char * const pString3 = pTmp;
pString3[1] = 'd'; //合法
pString3 = pAnother; //报错
如果我们的函数的返回值是以 指针形式 返回的,如果在函数前面加上const修饰,则表示指针指向的内容是不能被改变的,并且接收返回值的指针变量必须是const修饰的。函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。不要轻易的将函数的返回值类型定为const,除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
b.参数指针所指内容为常量不可变
void function(const char* Var);
d.参数为引用,为了增加效率同时防止修改。
void function(const TYPE& Var); //引用参数在函数内为常量不可变
两者效果是一模一样的,前者是值传递,后者是地址传递,所以这种传递比按值传递更有效.
(1)const修饰成员变量
const修饰类的数据成员,表示成员常量,不能被修改,不能在类定义处初始化,不能在构造函数里初始化,只能在初始化列表中赋值。
class A
{
…
const int nValue; //成员常量不能被修改
…
A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}
(2)const修饰成员函数
const修饰类的成员函数,则该成员函数不能修改类中任何非const数据成员。
class A
{
…
void function() const;
// 上面类中的成员函数func,因为成员函数的参数中会默认带上一个指向本类的实例化对象的this指针,
// 而后面的const修饰的就是这个this指针,表示this指向的变量的值在本函数中是不能被改变的,这就是这个const的作用。
}
// a. const成员函数不允许修改它所在对象的任何一个数据成员。
// b. const成员函数只能调用类的const成员函数。
对于const类对象/指针/引用,只能调用类的const成员函数,任何非const成员函数都不能被调用。因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。