目录
1.C++关键字与C语言关键字:
1.1.C语言关键字:
1.2.C++关键字:
1.3.C/C++常见关键字面试题:
1.4.volatile浅析:
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
-------------------------------------------------
原文作者链接: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。
-------------------------------------------------- 原文: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即时地读取到最新的数据,防止因编译器优化而导致数据不一致。