要对有些复杂的关键字有所理解,还是需要对C++有着更深入的了解。
11.const、volatile、mutable关键字
-
const在C++中用来修饰限定,当修饰普通变量时,被修饰的对象将不可改变,
const int a;
表示变量a将不可以被修改,编译器会执行这个约束,保证在之后的代码中将没有操作对其修改。
但修饰的变量是局部变量时,有时候会存在被其他方式改变的情况(例如指针赋值的情况),这时局部变量的值仍然被改变了,例如下面的代码:
const
这也说明虽然*p
也就是a
的值已经被改变,但是输出却是错误的。我们要输出真实的a的值,还需要加一个关键字volatile,这个关键字可以提醒编译器每次读取变量值的时候都去内存中读取真实的值。当我们加上时,可以看到输出变成了下图所示:
volatile
-
在修饰指针类型的变量时,const写在不同的位置有着不同的作用。
(1)const int* p;
//指针p地址中的内容是常量,不可改变。
(2)int* const p;
//指针p本身是一个常量,内容不可改变。
(3)const int* const p;
//指针本身和地址中的内容都是常量,都不可以改变。
总之,const修饰靠近他的变量,或是指针的指向,或是指针本身。 -
当const修饰函数参数时,传递的参数是值而不是地址时,无论怎么样都不会改变原来的变量值,所以此时不需要const关键字,但传递参数是一个指针时,与前面说的const修饰指针的用法相同,保证修饰的内容不变。传递的参数是引用时,需要保证这个引用指向的对象不改变,所以要使用上面的第一种修饰方式。
-
当修饰类的成员变量时,这个成员只能在初始化时赋值,不会在类中被改变。当修饰整个类定义的变量的时候,表示整个类成员不被改变,但此时有一个关键字mutable就是为了突破const的限制,即使定义类变量的时候会修饰为const,但由于成员中mutable的修饰,这个成员变量仍然可以被改变。
12.extern关键字
extern一般使用在全局变量在外部被使用时候的声明,当定义与使用不在同一个文件中时需要将其声明,extern int i;
13.new/delete关键字
new/delete本质上还是调用了malloc和free,但与malloc和free又有着许多的不同。
C++中new/delete主要用于动态创建和释放对象,他可以在new时自动调用构造函数,delete时自动调用析构函数,比起malloc/free来后者只能动态申请和释放空间。
new/delete和malloc/free
- malloc/free需要库文件stdlib.h支持,而new/delete不需要。
- new能调用构造函数,而malloc不会;delete将调用析构函数,而free不会。
- new能够自动计算需要分配的内存空间,不需要自己去指定,而malloc需要用户自己指定所需的空间大小。例如,
int* p1 = new int[2]; int * p2 = malloc(2*sizeof(int));
- new与delete直接得到具体类型的指针,malloc与free返回void类型的指针。
- new一般由两步构成,分别是new操作和构造。首先分配到内存,再调用具体的构造函数完成操作。
- new在申请单个类型变量时可以进行初始化,malloc不具备内存初始化的特性。
网友评论