const知识点总结

来源:互联网 发布:java获取11位时间轴 编辑:程序博客网 时间:2024/06/06 01:24

一.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修饰的成员方法