最近一直在迷惑着这两个关键字,感觉大脑里一片糊涂,特此整理一下:
一、const
1、数据常量,不能修改,必须初始化;
1)非类的数据成员
a、指向const对象的指针(remember)
b、const指针(remember)
2)作为类的数据成员
a、必须在构造函数中进行初始化,并且必须在初始化列表中进行初始化;
引申:必须对任何const或引用类型成员以及没有默认构造函数的类类型的额任何成员使用初始化式;
2、const成员函数
作为类的const成员函数,const关键字放在函数声明的后面,在函数定义时,也必须将const关键字放在函数的后面(对于static不是这样)。
1)设计const成员函数主要是不改变对象,正因为这样一个const成员函数不可能再声明为static,因为static加在成员函数上就表明该函数属于类而不属于类对象;
2)const成员函数可以被const对象或者非const对象调用,当被const对象调用时,函数中的this指针就变成了一个指向const对象的const指针(因为this指针本书就是一个const指针,它就是指向调用该函数的对象);
二、static
静态的;
1、对于对象进行修饰
1)对于全局变量加上static关键字后其存储位置没有变,还是在全局存储区,但是缩小了其作用域,生命周期也没有变;
2)对于局部变量加上static关键字后,其存储位置发生改变,存在全局存储区,作用域没有变,生命周期变了;
3)对于类的数据成员(属于类),加上static关键字后,在类定义出进行声明,还必须在.cpp文件进行定义;对于static整型数据成员,可以在类定义时进行赋值,但还必须在.cpp文件进行定义;
2)对于函数进行修饰
1)static成员函数(属于类),在类定义处进行函数的声明,要加上static关键字,在.cpp文件处进行定义的时候static关键字不用再加了;
三、初始化
在这里又想说一下对象的初始化
对于具有类类型的对象,会调用其所属类的默认构造函数实现初始化。内置类型的对象的初始化依赖于对象如何定义。如果对象在全局作用域定义(即不在任何函数中)或定义为静态局部对象,则这些成员将被初始化为0。如果对象在局部作用域中定义,则这些对象没有初始化,除了给他们赋值以外,出于其他任何目的对未初始化成员的使用都是有问题的;
见自己的测试
来源:oschina
链接:https://my.oschina.net/u/870940/blog/122010