C++ C 关键字 及说明

本文深入解析C++中的关键字,包括explicit、mutable、volatile、restrict、auto、register、extern、thread-local、inline、asm和operator的功能与使用场景。涵盖类型修饰、存储说明、内存管理、循环控制、跳转控制、分支结构、运算符等多个方面。

以下是C++ C 关键字 及说明 。

explicit: C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

mutable:  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

restrict关键字:用于使编译器放心的进行优化。关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

C语言和C++中auto关键字的使用有很大区别。在C语言中使用auto关键字声明一个变量为自动变量,是C语言中应用最广泛的一种类型,在函数内定义变量时,如果没有被声明为其他类型的变量都是自动变量,也就是说,省去类型说明符auto的都是自动变量。这里的其他类型指的是变量的存储类型即:静态类型变量(static )、寄存器类型变量(register)和外部类型变量(extern)。


auto val;    //当省略数据类型,只使用auto修饰变量,在C语言中默认变量为int型
  C++中的auto关键字是一个类型说明符,通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。编程时通常需要把表达式值式赋给变量,这就要求在声明变量时清楚的知道表达式的类型,C++11新标准引入了auto 类型说明符,让编译器去分析表达式的类型。由于,需要编译器推断变量或表达式的类型,所以,auto定义的变量必须初始化。


在早期c语言编译器不会对代码进行优化,因此使用register关键字修饰变量是很好的补充,大大提高的速度。

 register关键字请求让编译器将变量a直接放入寄存器里面,以提高读取速度,在C语言中register关键字修饰的变量不可以被取地址,但是c++中进行了优化。

 在C语言中有这么一个关键字——register,这个关键字的意思就是告诉编译器,最好把该关键字修饰的变量放在寄存器内。关于这个关键字还有一些注意点要学一下。

  1.被register修饰的变量必须是CPU能够接受的类型,因为有的机器识别不了浮点型,所以register变量的长度应该小于等于整形,但现在有的机器是可以使用浮点型的register变量的。

  2.在C语言中,一旦声明为寄存器变量,由于可能会保存到寄存器中,编译器是不允许对其取地址(&)的。

  3.只有局部自动变量和形参可以是寄存器变量,比如在C语言中,全局变量是不能用register修饰的,并且局部静态变量也不能用register修饰。

  4.register变量的个数是有限的,因为一个CPU只有那么多个寄存器,并且类型也会受到CPU的限制,并且某些寄存器只能接受特定的类型,如指针类型。

开头也说了,这个关键字只是告诉编译器最好将被修饰的变量放到寄存器中以加快存取速度,但是是否真正的存储的寄存器由编译器自己决定。

而在C++中,该关键字又有几点不同:

 (1)register 关键字无法在全局中定义变量,否则会被提示为寄存器无效。其实这一点在新的gcc编译器下C语言也不允许定义全局的register变量,因为生命周期直到程序结束,期间都作为寄存器变量的话明显不妥。

 (2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中。

extern

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!

  第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

thread-local 
1. 线程局部存储
线程局部存储提供了持久的每线程存储,每个线程都拥有一份对变量的拷贝。线程局部存储中的变量将一直存在,直到线程终止,届时会自动释放这一存储。一个典型的例子就是errno的定义(uClibc-0.9.32),每个线程都有自己的一份errno的拷贝,防止了一个线程获取errno时被其他线程干扰。
要定义一个线程局部变量很简单,只需简单的在全局或静态变量的声明中包含__thread说明符即可。例如:

static __thread int buf[MAX_ERROR_LEN];
这样定义的变量,在一个线程中只能看到本线程对其的修改。
关于线程局部变量的声明和使用,需要注意以下几点:

1. 如果变量声明中使用了关键字static或extern,那么关键字__thread必须紧随其后。
2. 与一般的全局或静态变量声明一样,线程局部变量在声明时可以设置一个初始值。
3. 可以使用C语言取址操作符(&)来获取线程局部变量的地址。


在一个线程中修改另一个线程的局部变量:
__thread变量并不是在线程之间完全隐藏的,每个线程保存自己的一份拷贝,因此每个线程的这个变量的地址不同。但这个地址是整个进程可见的,因此一个线程获得另外一个线程的局部变量的地址,就可以修改另一个线程的这个局部变量。

C++中对__thread变量的使用有额外的限制:

1. 在C++中,如果要在定义一个thread-local变量的时候做初始化,初始化的值必须是一个常量表达式。 
2. __thread只能修饰POD类型,即不带自定义的构造、拷贝、赋值、析构的类型,不能有non-static的protected或private成员,没有基类和虚函数,因此对定义class做了很多限制。但可以改为修饰class指针类型便无需考虑此限制。

POD全称Plain Old Data。通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。
POD类类型就是指class、struct、union,且不具有用户定义的构造函数、析构函数、拷贝算子、赋值算子;不具有继承关系,因此没有基类;不具有虚函数,所以就没有虚表;非静态数据成员没有私有或保护属性的、没有引用类型的、没有非POD类类型的(即嵌套类都必须是POD)、没有指针到成员类型的(因为这个类型内含了this指针)。

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。一般用户可以阅读函数的声明,但是看不到函数的定义。

asm允许你在你的代码中直接插入汇编语言指令, 各种不同的编译器为这一个指令允许不一致形式, 比如:

__asm关键字启动内联汇编并且能写在任何c/c++合法语句之处.它不能单独出现.它必须接汇编指令、一组被大括号包含的指令或一对空括号.术语“__asm 块”在这里是任意一个指令或一组指令无论是否在括号内。

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

   这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

c/c++关键字分类:

数据类型:void,int,char,float,double,bool,w_char

类型定义:struct,union,enum,class,typedef

常量值:true,false

类型修饰符:long,short,singed,unsigned

类型限定符:const,volatile,restrict

存储说明符:auto,register,static,extern,thread_local,mutable

其它修饰符:inline,asm

循环控制:for,while,do

跳转控制:break,continue,return,goto

分支结构: if,else,switch,case,default

内存管理:new, delete

运算符:sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq

访问限定符:this,friend,virtual,mutable,explicit,operator

类访问修饰符:private,protected,public

模板:template,typename

命名空间:namespace,using

异常处理:throw,try,catch

<think>首先,用户的问题是关于 "C++常用关键字" 的。所以,我需要基于提供的引用信息来回答这个问题。 回顾系统指令: - 回答必须使用中文。 - 对于数学表达式,使用特定的LaTeX格式,但在这个主题中,可能不涉及数学表达式,所以我可以忽略。 - 结构清晰,帮助用户逐步解决问题。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户提供了四个引用: - 引用[1]: 列出了C/C++常见关键字,并提到了一些专栏文章。 - 引用[2]: 解释了static关键字C++中的用法,包括静态全局变量。 - 引用[3]: 讨论了static修饰成员函数,以及#define和typedef。 - 引用[4]: 讨论了const关键字,特别是const指针,还有goto语句。 我需要综合这些信息来回答用户的问题:"我想查找C++常用关键字的相关信息 请问C++常用关键字"。 结构化回答: 1. **引言**:简要介绍C++常用关键字。 2. **详细解释**:基于引用,解释一些常用关键字,如static, const等。 3. **生成相关问题**:在结尾添加相关问题。 从引用中提取关键点: - 常用关键字包括:static, const, goto, 以及#define和typedef(虽然不是关键字,但密切相关)。 - 引用[1]提到常见的关键字如auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while。但引用[1]没有详细列出,只是说"常见的C/C++关键字如下所示",但原文中被截断了。 - 重点放在提供的引用上:static, const, goto。 所以,我可以说C++常用关键字包括static, const, goto等,并详细解释它们。 在回答中引用: - 当使用某个引用时,在段落末尾自然添加 [^n]。 回答结构: - 开头:解释什么是C++关键字。 - 主体:列出并解释几个常用关键字。 - 基于引用[2],解释static关键字。 - 基于引用[4],解释const关键字。 - 基于引用[3],解释static成员函数。 - 基于引用[4],解释goto语句。 - 结尾:简要总结,并生成相关问题。 生成相关问题: - 类似之前的示例:"§§相关问题§§",然后列出几个问题。 确保回答真实可靠:只基于提供的引用信息。 最终回答大纲: 1. 介绍C++关键字的重要性。 2. 详细解释static关键字:静态全局变量、静态成员函数(引用[2]和[3])。 3. 解释const关键字:常量指针、指针常量等(引用[4])。 4. 解释其他关键字如goto(引用[4])。 5. 总结。 6. 相关问题。 </think>以下是对C++常用关键字的详细解释。C++关键字是语言中预定义的保留字,用于声明变量、控制流程、定义类型等。它们构成程序的基础结构,正确理解这些关键字对编程至关重要。我会基于您提供的引用信息,逐一解释最常用的一些关键字(如 `static`、`const`、`goto` 等),并结合实际代码示例说明其用法。需要注意的是,C++标准定义了约90个关键字(如 `auto`, `break`, `class`, `const`, `static`, `goto` 等),但此处重点聚焦在引用中强调的常用场景。 ### 1. `static` 关键字 `static` 是C++中最常用的关键字之一,它控制变量的存储方式和可见性,可分为两类用法: - **面向过程的用法**:用于全局变量或局部变量。 - **静态全局变量**:在全局变量前加 `static`,限定其作用域仅在当前文件内,避免命名冲突。例如: ```cpp #include <iostream> using namespace std; static int n; // 静态全局变量,仅在当前文件可见 void fun(); int main() { n = 20; cout << n << endl; // 输出: 20 fun(); // 输出: 21 return 0; } void fun() { n++; // 修改静态全局变量 cout << n << endl; } ``` 此例中,`n` 的生命周期延长至整个程序运行期间,但只能被本文件访问[^2]。 - **面向对象的用法**:用于类成员。 - **静态成员函数**:不与特定对象关联,可直接通过类名调用。这常用于工具函数或共享数据操作。 ```cpp class MyClass { public: static void staticMethod() { // 静态成员函数 cout << "Static method called" << endl; } }; int main() { MyClass::staticMethod(); // 推荐调用方式:类名直接调用 return 0; } ``` 静态成员函数不依赖于对象实例,适合处理类级别逻辑[^3]。 `static` 的优点包括减少内存占用(共享存储)和封装作用域,但需注意线程安全问题。 ### 2. `const` 关键字 `const` 用于声明常量,确保变量值不被修改,尤其在指针操作中很常见: - **修饰变量**:使变量成为只读常量。 ```cpp const int MAX = 100; // 常量,值不可更改 ``` - **修饰指针**:分为三种情况(基于指针指向和值的可变性): - **常量指针**:指针指向可改,但指向的值不可改(`const int*`)。 ```cpp int a = 10, b = 20; const int* p = &a; // 常量指针 // *p = 30; // 错误:值不可修改 p = &b; // 正确:指向可修改 ``` - **指针常量**:指针指向不可改,但指向的值可改(`int* const`)。 ```cpp int a = 10; int* const p = &a; // 指针常量 *p = 20; // 正确:值可修改 // p = &b; // 错误:指向不可修改 ``` - **常量指针常量**:指向和值均不可改(`const int* const`)。 ```cpp const int a = 10; const int* const p = &a; // 指向和值都不可改 ``` `const` 提升代码健壮性,防止意外修改数据,常在函数参数和类成员中使用[^4]。 ### 3. `goto` 关键字 `goto` 用于无条件跳转到标签位置,但现代编程中不推荐使用,易导致代码难以维护: ```cpp #include <iostream> using namespace std; int main() { int i = 0; loop: // 标签定义 cout << i << " "; i++; if (i < 5) goto loop; // 跳转到标签 return 0; } // 输出: 0 1 2 3 4 ``` 尽管 `goto` 在简单循环中可用,但易引发“面条代码”,建议优先使用 `for` 或 `while` 替代[^4]。 ### 其他常用关键字简要说明 - **`auto`**:自动类型推导,简化变量声明(如 `auto x = 10;`)。 - **`class`**:定义类结构,封装数据和函数。 - **`break`/`continue`**:控制循环流程(`break` 退出循环,`continue` 跳到下一次迭代)。 - **`typedef` 和 `#define`**:虽然不是关键字,但常用于类型重命名(`typedef int MyInt;`)和宏定义(`#define PI 3.14`),前者更安全[^3]。 ### 总结 C++常用关键字包括 `static`(控制作用域和存储)、`const`(确保常量性)、`goto`(跳转控制)等,它们是构建高效可靠程序的基础。掌握这些关键字能避免常见错误,如数据竞争或意外修改。实践中,应优先使用现代C++特性(如智能指针替代裸指针)以提高安全性。更多案例可参考相关专栏文章[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值