C++ static、const、auto、explicit关键字作用

来源:互联网 发布:滴滴打车java面试题 编辑:程序博客网 时间:2024/05/18 02:41

一、static关键字作用:

1、函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

2、在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外的其他函数访问;

3、在模块内的static函数只能被这一模块的其他函数调用,这个函数的使用范围被限定在声明它的模块之中;

4、在类中static成员变量属于整个类所有,对类的所有对象都只有一份拷贝;

5、在类中的static成员函数属于整个类所有,这个函数不接受this指针,因而只能访问static成员变量。


二、const关键字的作用:

1、欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对其进行初始化,因为以后就没有机会再去改变它了;

2、对指针来说,可以限定指针本身为const,可以限定指针所指向的数据为const,或者二者同时为const。const限定其值不能被改变;

 eg: const char* p=“abcdd” 说明p所指向的变量的值不能被改变。 char* const p=“abcdd”说明p指针所指针的地址不能被改变;

3、在一个函数内,const可以修饰形参,表明其是一个输入参数,在函数内部不能改变其值;

4、对于类的成员函数,若指定其为const类型,表明这是一个常函数,不能用于修改类的成员变量;

5、对于类的成员变量,有时候必须指针其返回值为const类型,以使得其返回值不能为“左值”。


三、auto关键字作用:

 auto用来申明自动变量,表明变量具有本地范围,其实大多数普通声明方式声明的变量都是auto变量,不需要明确指定auto关键字。auto变量在离开作用域时会自动释放,不会发生内存溢出情况(除了包含指针的类)。使用auto变量的优势在于不需要考虑变量是否被释放。


四、explicit关键字:

explicit用来防止由构造函数定义的隐式转换,可以避免不合时宜的类型变换。

eg:

不加explicit关键字,构造时会进行隐式转换,在声明对象b时,等价于test temp("324");test b=temp

class test{public:test(const std::string strTest){}};int main(){testa("123");testb="324";//等价于test temp("324");test b=tempreturn 0;}

而如果在构造函数之前加上explicit关键字,编译器会提出错误如下:

1>d:\mytest\1111.cpp(11) : error C2440: “初始化”: 无法从“const char [4]”转换为“test”
1>        class“test”的构造函数声明为“explicit”

在实际代码中可能不会出现这种故意造就的例子,但发生隐转换,常常带来程序逻辑的错误,而且这种错误很难察觉。


effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。


0 0
原创粉丝点击