优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++的这些关键字你都用过吗(c++常用关键字)

nanyue 2024-07-18 22:20:09 技术文章 9 ℃

关键字是对编程语言有特定含义的词或标识符,C++在C语言32个关键字的基础上又新增了很多功能强大且实用的关键字。那么,下面这些关键字,你有见过或者用过吗?

auto

这个关键字应该很多人都见过,但是用的比较少而已。C++是强类型语言,变量必须指明类型。但是在C++功能越来越丰富,越来越强大的时候,例如模板的出现导致又是并不清楚某些复杂的expression会返回何种类型,此时auto就起了很大作用:自动类型推断和返回值占位。类似于C#中的var,系统可以自动推断变量类型

auto x = 1 ;//x为int型
auto y = 1.2 ;//y为float型
auto c = "ss" ;//c为string型
vector<int> vec(3) ;
auto itera = vec.begin();//vec的正向迭代器
auto itera_r = vec.rbegin();//vec的反向迭代器

and, and_eq, or, or_eq, not, not_eq

这些都是C++11中新增的关键字,都是用来处理逻辑操作的。有了这些关键字C++写起来居然有点python的味道。

and相当于&&;
 and_eq相当于&=;
 or相当于||;
 or_eq相当于|=;
 not相当于!
not_eq相当于!=

nullptr

nullptr是避免野指针的一大利器,我们一直用的NULL表示空指针,但是殊不知在某些极端情况下,NULL可能会出现意料之外的情况。NULL的定义为:NULL的定义为:#define NULL ((void *)0),也就是说NULL实质上是一个void *指针。请看下面的代码:

void Func(char *);
void Func(int);
int main()
{
 Func(NULL);
}

如果此时NULL表示一个空指针的话,实际上我们Func(NULL);本意是要调用Func(char *);因为C++把NULL定义为0,所以实际结果却是调用的Func(int);

nullptr的使用也是十分的简单

char *p1 = nullptr; 
int *p2 = nullptr;

noexcept

C++在函数申明时一般是默认可以抛出任何异常,但是可以用throw来指定该函数可以抛出的异常的类型,这样方便函数调用处理时catch语句好匹配。

void func_anyException();//可以抛出任何异常
void func_NoException() throw();//不可抛出任何异常
void func_defineException() throw(char*,int);//只可以抛出char* 和 int类型异常。

而C++11新增的noexcept,看翻译就知道是不抛出任何异常的意思,那么

void func_NoException() throw();
void func_NoException() noexcept;

上面两个申明在语法上功能是一摸一样的,区别就是程序运行时的行为和编译器优化的结果。当使用noexcept时,如果运行时函数抛出异常而有没有适合类型的catch语句,std::teminate()函数会被立即调用,而不是调用unexpected(); 而throw在这种情况下就会先调用unexpected()
所以,noexcept在异常处理的过程中,编译器不会回退栈,这为编译器的优化提供了更大的空间。

register

register是从C语言就存在的一个关键字,但是我好像从来没用过。register修饰符暗示编译程序相应的变量将被频繁地使用,请求编译器将其保存在CPU的寄存器中,以加快其存储速度。

register char *s;
register int a;

但是register需要注意一下几点:

1、register变量必须是一个单个的值,并且长度不能太长,一般不能大于一个int的长度

2、不能被取地址,也即&a是非法的

3、register static int a非法,局部静态变量不可申明为register,全局变量也不可申明为register

最近发表
标签列表