一.const修饰常量和defin定义常量的区别
用define定义常量,是没有类型检查的,只是define所定义的宏变量在预处理的时候进行替换,在需要使用的地方进行拷贝一份。const修饰变量有类型检查,需要一定的内存空间,存放在静态区。在程序运行过程中const定义的变量只有一份拷贝,而define宏常量却有多份拷贝,故而运行时宏定义消耗的内存要比const消耗的内存多。
总结如下:
define:
在预处理阶段进行替换
无类型,不进行类型安全检查,可能产生错误
不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大
const:
在编译时确定其值
编译时会进行类型检查
在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝
二、const修饰变量和指针
1、修饰普通变量,防止变脸被修改
const int a = 100;
2、修饰函数参数, 保护传参时参数不被修改
char *my_strcpy(char dst, const char *src);
以下这个函数会报错
void print(const int &a)
{
a = 100;
printf("%d\n", a);
}
下面这个函数不会报错
void print2(int &b)
{
a = 100;
printf("%d\n", a);
}
如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护。
3、const修饰指针
a.修饰的的对象的值可变,指向的地址不可变
const int* val/int const* val;
b.修饰的的对象的值不可变,指向的地址可变
int* const val;
c.两者都不可变
const int* const val
三、const 修饰函数的返回值
1、指针传递
指针传递方式的函数返回值加const 修饰,那么函数返回值(指针)不能被修改。
const char * GetStr(void);
const char *str = GetStr(); //正确写法
2、值传递
函数返回值是“值传递”方式,函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
下面写法错误
int GetInt(void)
const int GetInt(void)//错误
3、引用传递
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数
四、const修饰成员变量
和修饰普通变量一样
char *p = NULL;
int * a1 = &p;
const int * a2 = &p;
int * const a3 = &p;
int const * const a4 = &p;
const int * const a5 = &p;
五、const修饰成员方法
class A
{
public:
A(){}
~A(){}
void print();
int GetNumber(void) const;
private:
int m_num;
char *m_data;
};
int A::GetNumber(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
print(); // 编译错误,企图调用非const 函数
return m_num;
}
总结,当const修饰成员函数时,不能去修改非const修饰的成员变量,不能调用非const修饰的成员方法
本文详细介绍了C++中const的用法,包括const与#define的区别、const修饰变量和指针的作用、const修饰函数返回值的场景,以及const修饰成员变量和成员函数的意义,强调了const在类型检查和保护不变性方面的重要性。
1697

被折叠的 条评论
为什么被折叠?



