C++中关于const的思考
在学习C++的过程中,经常被什么时候使用const、为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结。
1、值替代
使用#define的确单缺点,第一:没有类型信息,这就会隐藏一些很难发现的错误;
第二:如果只是想取某个class的专属常量地址,#define无法创建一个class的专属常量
第三:#define或许不被视为语言的一部分,这样会导致PI可能不会被编译器看见,以至于在运用此常量时会产生错误信息;
第四:#define不能提供任何封装性
第五:用#define定义一个函数,容易产生一些不可思议的错误
关于const,第一:const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到;
第二:如果用运行期间产生的值初始化一个变量而且知道在变量生命期内是不变的,则用const限定该变量是程序设计中的一个很好的做法
第三:不能在编译期间使用const的值,因为编译器在编译期间不需要知道它存储的内容
第四:C++中的const默认是内部连接,如果想更改为外部连接以便让另外一个文件可以对它引用,需要在前面定义成extern
extern const int x=1;此时强制分配了内存
如果只是声明,extern const int x;则意味着在别处进行了定义。
2、指针
在指针中,const的位置不同,其代表的含义也就不同。
A、关键字const在指针左边,表示被指物是常量。如:
const int* u;
int const* v;
B、关键字const在指针右边,表示指针自身是常量,即这个指针不能指向其它东西,但所指的东西的值可以改变。如:
int d=1;
int* const w=&d;
C、关键字const在指针两边,表示被指物和指针两者都是常量。
int d=1;
const int* const x=&d;
int const* const x2=&d;
3、函数参数和返回值
A、函数参数
如果函数参数是按值传递的,可以用指定参数是const的。在函数参数中使用const限定参数表示参数不能被改变。
B、返回值
对于内建类型,按值返回一个内建类型时,应该去掉const;
对于用户定义的类型,如果一个函数按值返回一个类对象为const时,那么这个函数的返回值不能被赋值,这个有点像只读属性。
4、类
第一:类中const的初始化是在构造函数初始化列表,表里的初始化发生在构造函数的任何代码执行之前。
第二:为了让类有编译期间的常量成员,需要使用static const,必须在static const定义的地方对它进行初始化。关键字static意味着不管类的对象被创建多少次,都只有一个实例。类中的一个常量成员,在该类的所有对象中它都一样。
class A{
static const int size=100;
const string* b[size];
}
第三:两个成员函数如果只是常量性不同,可以被重载。
第四:如果声明一个成员函数为const,则等于告诉编译器该成员函数可以为一个const对象所调用。如果想让成员函数按声明的方式去做,还需要在定义函数时重申const。
第五:前面带const的函数声明,表示该函数的返回值为const。要实现函数的返回值为const,需要在函数的参数表后面放一个const。
第六:在类声明里声明mutable,可以指定一个或多个数据成员在一个const对象里被改变。
class Z{ int i; mutable int j; public: Z(); void f() const; }; Z::Z():i(0),j(0){} void Z::f() const{ i++; //此时会报错,不能修改i j++; //可以修改j }
第七:按位const的意思是对象中的每个字节都是固定的,所以对象的每个位映像从不改变
按逻辑const的意思是,虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。
第八:构造函数和析构函数都不是const成员函数,因为它们在初始化和清除时,总是对对象做些修改。
目前只总结了这么多,如果有漏的或不对的地方,希望大家指出,谢谢。