目录
1.C++关键字与C语言关键字:
1.1.C语言关键字:
- c语言共有32个关键字,进行分类,有12个数据类型关键字,12个控制语句关键字,4个存储类型关键字,4个其他关键字;
- 12个数据类型关键字:
-
数据类型关键字 含义 char 用来定义为字符型变量或函数。它的范围通常为1个字节。它在内存中是以ASCII码来表示的。 short 声明短整型变量或函数 。 int 声明整型变量或函数。注意在16位和32位系统中它的范围是不同的。16位中占用2个字节。32位中占用4个字节。 double 声明为双精度类型。它的范围为8个字节。14位为小数位。也可使用更高精度的long double 它的范围则更大,达到10字节。 float 声明浮点型的变量和函数,也叫实型。它的范围固定为4个字节。其中6位为小数位。其他为整数位。 long 声明长整型的变量或函数。 enum 声明枚举变量。 signed 将变量声明为有符号型. 默认变量就为signed 型。一般可省略 unsigned 定义为无符号的变量.. 默认变量都为有符号的.除非显示的声明为unsigned的. struct 用来声明结构体类型。结构体可以包含各种不同类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。 union 定义联共用体。用法用struct相同。不同的是共用体所有成员共享存储空间. void 空类型.. 一般用于声明函数为无返回值或无参数。 控制语句关键字 关键字 含义 循环语句 for 循环语句 do 循环语句循环体 while 循环条件 break 跳出当前循环 continue 结束当前循环,开始下一次循环 条件语句 if 条件语句 else 条件语句否定分支 goto 无条件跳转语句 开关语句 switch 开关语句 case 开关语句分支 default 开关语句分支 return 子程序返回语句 存储类型关键字 含义 auto 声明自动变量。 可以显式的声明变量为自动变量。只要不是声明在所有函数之前的变量,即使没加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值。 exterm 声明全局变量。同时声明在main函数之前的变量也叫全局变量。它可以在程序的任何地方使用。程序运行期间它是一直存在的。全局变量也会初始化为0. register 声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存在寄存器之中的。速度要快很多。对于需要频繁使用的变量使用它来声明会提高程序运行速度。 static 声明静态变量。可以显式的声明变量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍旧不还原。即使没有给静态变量赋值,它也会自动初始化为0。 含义 const 定义为常量 typedef 类型重定义..可以重定义类型。 sizeof 用来获取变量的存储空间大小。 volatile 将变量声明为可变的. 1.2.C++关键字:
1.数据类型:void,int,char,float,double,
bool :bool类型,属于基本类型中的整数类型;取值范围仅有两个值:true和false。在做逻辑运算时,默认非零即为ture。
2.类型定义:struct,union,enum,typedef
class:定义类
3.常量值:true,false :bool即为布尔类型,属于基本类型中的整数类型,取值为真和假。true和false是具有布尔类型的字面量,为右值,即表示真和假。
4. 类型修饰符:long,short,singed,unsigned
5.类型限定符:const,volatile,
restrict
6.存储说明符:auto,register,static,extern,thread_local,mutable
7.其它修饰符:inline,
:语句分隔符
8.循环控制:for,while,do
9.跳转控制:break,continue,return,goto
10.分支结构: if,else,switch,case,default
11.内存管理:new, delete
12.运算符:sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq
13.访问限定符:this,friend,virtual,mutable,explicit,operator
14.类访问修饰符:private,protected,public
15.模板:template,typename
16.命名空间:namespace,using
17.异常处理:throw,try,catch
1.3.C/C++常见关键字面试题:
-------------------------------------------------
原文作者链接:https://blog.csdn.net/cc_clear/article/details/76943425
1.static关键字的作用?
1)、static 申明的变量为静态全局变量,该变量存储在静态数据区,当整个程序结束时该变量才会被释放,只是生命周期延长,作用域不受影响。
2)、static申明的变量定义时如果不初始化默认初始化为0
3)、被static修饰的变量只能作用于本文件内,即使被extern修饰也不行
2.const,define的区别
1)、const修饰的变量为只读变量,定义一个const类型的变量时必须完成初始化
2)、define意为宏定义一个常量,给某个命名变量宏定义一个确定的数值,在预编译期间将会完成一个替换的动作,用宏定义的值替换给变量名。
3)、const也可以修饰函数的参数列表以及函数的返回值,参数返回值被const修饰代表参数和返回值均不能被改变。
4)、const修饰的变量可以通过强制类型转换转为非const
5)、const修饰的成员变量只能在构造函数的初始化列表进行初始化。并且不能修改
6)、const修饰成员函数,该成员函数不能修改任何成员变量的值
7)、const修饰对象:该对象中所有的成员都变成只读,而且该对象的所以成员函数都必须被const修饰。
3.new/delete ,malloc/free的区别
(1)new/delete malloc/free都是用来动态申请内存空间的 ,两组必须成对使用。
(2)new/delete为运算符,malloc/free为库函数需要头文件
(3)new/delete为对象申请释放内存会调用相应的构造函数和析构函数 malloc/free则不会
(4)new有数据类型的检查,是类型安全的,malloc无数据类型的检查返回值为void*
(5)new申请内存空间必须指明要存放的数据类型和要存放对象的数目,malloc只需要指明申请空间的大小,可以通过显示地强制类型转换改变返回值的数据类型
4.auto(C++)
auto申明的变量必须初始化,程序会根据初始化的值的数据类型来自动确定该变量的数据类型。
5.指针和引用的区别
(1)指针和引用都是通过地址索引数据的。
(2)指针存放的是变量的地址,引用是变量的别名。
(3)指针也是一个变量需要占用4个字节(32位机器)的内存空间,引用不需要占用内存,它只是变量的一个别名。
6.面向对象和面向过程
面向对象:面向主要是以目标对象为研究体,这一思想的实现需要对各种不同属性的类进行封装,进而分析每种类型事物的属性和功能方法,
这种思想将计算机软件系统与外界系统一一对应,进行有针对性的研究。核心在于 (对象 + 消息)
面向过程:C语言是面向过程的编程语言,这种思想主要是为了去实现某种功能或目标去一步步研究算法流程,步步求精,
进而用一种最为简捷的过程来实现最终的目标,核心为 (算法+数据)
7. static修饰类的成员变量和成员函数
(1)static修饰的成员变量属于这个类,不属于某个对象。
(2)static修饰的成员变量需要在类外进行初始化。
(3)static修饰的成员函数只能访问static修饰的成员变量,不能访问普通成员变量。
(4)static修饰的成员函数没有this指针。
(5)基类static修饰的成员变量继承给子类也只存在一份,基类和派生类共享该成员。
(6)类内部可以定义静态的类对象成员,即 可以定义static修饰的类对象
// public:static base A; (正确) public: base A; (错误)
8.mutable关键字
被mutable修饰的成员变量,是可变的,可以修改的,即使某个对象是const类型,该成员变量也可以被修改。在被const修饰的成员函数中该变量也可以被修改。
9.explicit:
只能修饰构造函数,防止单参数的构造函数隐式类型转换,把一个常量转换成一个对象。
在没有加explicit之前,可以把一个常量赋给一个对象。
推荐构造函数前最好加explict。
1.4.volatile浅析:
--------------------------------------------------
原文:https://blog.csdn.net/CC_clear/article/details/76940724
为什么会有volatile关键字呢?
首先我们先来了解一下程序优化处理
程序优化处理的主要方法:
(1)由于CPU的处理速度远远大于内存的读写速度,为提高整体性能,在硬件上引入硬件高速缓存Cache,就加速对内存的访问。
(2)CPU中指令的执行顺序,如果没有相关性的指令可以乱序执行,这样一便可以充分利用CPU的指令流水线,提高执行速度。
(3)编译器自动对程序进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器,调整指令顺序充分利用CPU指令流水线。
(4)在实际的编程中,程序员可以主动对程序进行编译前优化,提高程序运行效率。
程序优化示例:
int* ptr = A;
for(int i = 0;i< 100;i++)
{
*ptr = i;
}
上面的程序很容易看懂,循环一百次给ptr指向的内容赋值,但是前99次的赋值是毫无意义的,因此编译器会对此进行如下优化
int* ptr = A;
*ptr = 99;
避免了前99次的循环赋值,提高了程序运行速度,大大节省了时间。
volatile关键字解释
(a). 该关键字意思为易变的,因为有些时候某个变量容易被改变,所以我们需要读取当前该变量最新的数据,不需要编译器做优化处理。
(b). 主要用于多线程中。volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现读取数据不一致的现象。
我们用多线程实例详细说明一下读取数据不一致现象(在多线程环境中):
在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。
综上所述,总结一下
(1) 一般的程序中,我们尽量避免使用volatile关键字,因为有时候我们需要编译器对我们的程序进行优化处理,以提高程序运行速度,进而提高CPU效率。
(2) 然而在特殊情况中,比如多线程多任务程序中,我们尽量使用volatile关键字,让CPU即时地读取到最新的数据,防止因编译器优化而导致数据不一致。