一、const基础知识(用法、含义、好处)html
int main()
{
const int a; //a为const,常数型数
int const b; //b为const,常数型数
const int *c; //c为const,指向长整型数的指针(所指向的内存数据不能修改,但自己能够修改)
int *const d; //int*为const,常量指针(指针变量不能被修改,可是它所指向内存空间能够被修改)
const int * const e; //int*为const;e为const,指向常整形的常指针(指针和它所指向的内存空间,都不能被修改)
return 0;
}
const在 * 左边,变量为const;c++
const在 * 右边,指针为const.数组
int func1(const)安全
初级理解:const是定义常量==》const意味着只读函数
const好处this
//合理的利用constspa
一、指针作函数参数,能够有效的提升代码的可读性,减小bug.指针
二、清楚的分清参数的输入和输出特性htm
int setTeacher_err(const Teacher *p);对象
const修改形参的时候,在利用形参不能修改指针所指向 的内存空间
二、C中的“冒牌货”
//c语言中的const是一个冒牌货,能够被指针间接修改
//c++中const是一个真正的常量,不能被修改
int main() { //好像a是一个常量,但其实不是 const int a=10; int *p=(int *)&a; printf("a=%d\n",a); *p=11;//间接赋值,c语言会赋值成功,c++赋值不成功 printf("a=%d\n",a); return 0; }
c的结果:
a=10
a=11
c++的结果:
a=10
a=10
解释:
c++编译器对const常量的处理:
当遇见常量声明时,在符号表中放入常量 ==》 问题,如何解释取地址?
编译过程当中若发现使用常量则直接以符号表中的值替换。
编译过程当中若发现对const使用了extern或者&操做符,则给对应的常量和分配存储空间(兼容C)
联想:下面的等式是否成立?
int &a = 1(err) & const int &a = 10
注意:c++编译器虽然可能为const常量分配空间但不会使用器存储空间中的值。
结论:
C语言中的const变量
c语言中的const变量是只读变量,有本身的存储空间。
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,而且须要在其余文件中使用,会分配存储空间。
当使用&操做符取const常量的地址时,会分配存储空间。
当const int &a=10;const 修饰引用时,也会分配存储空间。
三、const在C和C++中的含义(笔试热点):
⑴C中的const,功能比较单一,较容易理解:
做用:被修饰的内容不可更改。
使用场合:修饰变量,函数参数,返回值等。(c++中应用场合要丰富的多)
特色: 是运行时const,所以不能取代#define用于成为数组长度等须要编译时常量的状况。同时由于是运行时const,能够只定义而不初始化,而在运行时初始化。如 const int iConst;。 另外,在c中,const变量默认是外部连接,所以在不一样的编译单元中若是有同名const变量,会引起命名冲突,编译时报错。
⑵c++中的const:
a、非类成员const:
①const变量默认是内部链接的,所以在不一样的编译单元中能够有同名的const 变量定义。
②编译时常量,所以能够像#define同样使用,并且由于上面一点,能够在头文件中定义const变量,包含的不一样的cpp文件(编译单元)中使用而不引发命名冲突。
③编译器默认不为const变量分配内存,除非:1. 使用 extern 申明, 2:程序中有引用const 变量的地址。
④c++中临时对象/内置变量默认具备const属性。
b、类中的const:
①与c语言中的const同样,只是运行时常量,不能做为数组维数使用,即不能取代#define。
在类中使用下面两种方式取代#define:
1:static const...
2 : enum{....}//enum 不占存储空间。
②类中的const 变量占用存储空间。
③类中的const成员变量须要在构造函数初始化列表中初始化。
④const 对象:在该对象生命周期内,必须保证没有任何成员变量被改变。const对象只能调用const成员函数。
⑤const成员函数: void fun() const ... 不只能被const对象调用,也能被非const对象调用,所以,若是确认一个任何成员函数不改变任何成员变量,应该习惯性将该函数定义成const类型。
⑥若是一个对象被定义成const,那么该const对象“可能”会被放入到ROM当中,这在嵌入式开发当中有时很是重要。
四、const和#define的区别
const分配内存的时机,是编译器编译期间,与#define相同
C++中的const常量相似于宏定义#define
const int c=5 等价于 #define c 5
1) 编译器处理方式不一样 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。
2) 类型和安全检查不一样 define宏没有类型,不作任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。
注意:尽可能以const替换#define
五、类成员中的const变量
> 类中的const成员变量都要放在初始化列表之中进行
> const数据成员
> 引用数据成员
> 对象数据成员(内置类)
const成员函数
> void print() const => const 类名 * const this
> 在其内部是不能修改数据成员
> 也不能调用非const成员函数
> const对象只能调用const成员函数,必需要提供一个const版本的成员函数
再深刻探讨类的const成员和成员函数,参考:https://www.cnblogs.com/cthon/p/9178701.html
补充:
> 类中的static数据成员须要在类以外进行初始化
> 被类或类建立的对象共享
> 全局/静态区
静态成员函数
> 它的形参列表之中没有隐含的this指针
> 不能调用非静态的数据成员
> 不能调用非静态的成员函数
> 只能调用静态的成员
> 能够直接经过类名调用
再深刻探讨类的static成员和成员函数,参考:https://www.cnblogs.com/cthon/p/9178527.html