一、C/C++ 关键字
1、 static (静态)变量有什么作用
在C语言中,关键字static 的意思是静态,它有三个明显的作用
a、在函数体内,静态变量具有”记忆功能“,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。(也就是经过一次的初始化,之后其值就不会进行改变)
b、在模块内(但在函数体外),它的作用范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外的其他函数访问。它是一个本地全局变量。
c、在模块内,如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可被这一模块内的其他函数调用,不能被模块外的其他函数调用,也就是说这个函数被限制在声明它的模块的本地范围内使用。
具体而言:
static 全局变量和普通的全局变量区别在于static 全局变量只初始化一次,这样做的目的是为了防止在其他文件单元中被引用。
static 局部变量和普通局部变量的区别在于static 全局变量只初始化一次,下一次的运算依据是上一次计算的结果值。
static()函数与普通函数的区别在于作用域不一样,static()函数只在一个源文件中有效,不能被其他源文件使用。
在C++中,在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。静态数据成员有以下特点:
a、对于非静态数据成员,每个类对象都有自己的复制品。而静态数据成员被当作是类的成员只有一份复制品。
b、静态数据成员存储在全局数据区,在定义时要分配空间,故不能在类声明中定义。
c、静态数据成员和普通数据成员 一样遵循从public、protected、private 访问规则。
d、static 成员变量的初始化在类外,此时不能再带上static 关键字。
2、const 有哪些作用
常类型也成为 const 类型,是指使用类型修饰符const 说明的类型。
在C语言中,它主要用于定义变量为常类型以及修饰函数参数与返回值。
在C++中还可以修饰函数的定义,定义类的成员函数。常类型的变量或对象的值是不能被更新的。
作用:
a、定义const 常量,具有不可变性。
b、进行类型检查,使编译器对处理内容有更多的了解,消除了一些隐患。
c、避免意义模糊的数字出现,同样可以很方便的进行参数的调整和修改。
d、保护被修饰的东西,防止被意外的修改,增强了程序的健壮性。
e、为函数的重载提供参考。
f、节省空间,避免不必要的内存分配。
(宏定义不分配内存,替换的时候要分配内存;const 定义不分配内存,第一次分配后,以后不分配内存)
g、提高了程序的效率。
3、switch 语句中的case 结尾是否必须添加break语句?为什么
需要,因为如果不添加break语句,程序通过确定的入口后,将一直执行下去,除非遇到break。
4、volatile 在程序设计中有什么作用
volatile 是一个类型修饰符,它用来修饰被不同线程访问和修改的变量。被volatile 类型定义的变量,系统每次用到它的时候都是直接从对应的内存当中提取,而不会利用Cache中原有的数值,以适应它的未知合适会发生的变化,系统对这种变量的处理不会做优化。
所以,volatile 一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等。
5、断言 ASSERT()是什么
ASSERT()一般被称为断言,它是一个调试程序时经常使用的宏。通常用于判断程序中是否出现了非法的数据,在程序运行时它计算括号内的表达式的值。错误,终止运行。ASSERT()捕获的是非法情况而不是错误情况。
6、枚举变量的值如何计算
在枚举中,某个变量的值默认为前一个变量的值加1 ,而如果第一个枚举变量没有被赋值,则其默认值为0。
7、char str1[] = "abc"; char str2[] = "abc"; str1[] 和str2[] 不相等,为什么?
str1和str2 两者都是字符数组,每个都有自己的存储区,它们的值是各存储区的首地址。
8、为什么有时候main()函数会带参数?参数argc 与argv 的含义是什么?
在C99标准中,运行main()函数没有参数或者有两个参数。
int main(int argc, char *argv[])
其中第一个参数argc 表示命令行参数的数目,它是int 型的;第二个参数argv 是一个指向字符串的指针数组。
9、C++里面是不是所有的动作都是main()函数引起的
不是。对于C++程序而言,静态变量,全局变量、全局对象的分配早在main()函数之前就已经完成了。
10、*p++ 与 (*)p++ 等价吗?为什么?
不等价。考察运算符优先级。 单目 ——算术——移位——关系——逻辑
11、前置运算与后置运算有什么区别
以++ 操作为例,对于变量a,
++a 表示取a的地址,增加它的内容,然后把值放在寄存器中;
a++ 表示把它的值装入寄存器,然后增加内存中a的值。
对于迭代器和其他模板对象使用前缀形式的自增、自减运算符。一般推荐使用前置自增,因为比后置效率更高。
12、a 是变量, 执行(a++)+ = a 语句是否合法
考察左值与右值
左值:出现在表达式左边的值,可以被改变,它是存储数据值的那款内存的地址,也称为变量的地址。
右值:是指存储在某内存地址中的数据,也称为变量的数据。
左值可以作为右值,但右值不能作为左值。
本题不合法,a++不能当作左值使用,它表示取a的地址,把它的值装入寄存器,然后对内存中a的值执行加1操作
++a 可以当左值使用,它表示取a 的地址,对它的内容进行加1 操作,然后把值放在寄存器中。
13、如何进行float 、bool、int、指针变量与”零值“的比较
int 类型:if(n==0)或者if(n !=0)
float类型:const float EPSINON = 0.00001
if((x >= -EPSINON ) &&(x <= EPSINON ) )
bool 类型:if(flag) if(!flag)
指针类型:if(p==NULL) if(p!=NULL)
14、new/delete 与 malloc/free 的区别是什么
在C++中,申请动态内存与释放动态内存,用new/delete 与 malloc/free 都可以,申请的内存都位于堆中。
在C语言中需要头文件<stdlib.h>,new/delete 是C++的运算符。
new/delete 与 malloc/free 的区别:
a、new 能够自动计算需要分配的内存空间,而malloc 需要手工计算字节数。
b、new 与delete 直接带具体类型的指针,malloc 与free 返回void 类型的指针。
c、new 是类型安全的,而malloc 不是。
d、new 一般由两步构成,分别是new 操作和构造。new 操作对应于malloc, 但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存的设备上,而malloc 不行。
e、new 将调用构造函数,而malloc 不能;delete 将调用析构函数,而free不能。
f、malloc/free 需要库文件stdlib.h支持,而new/delete 则不需要库文件的支持。
15、什么时候需要将引用作为返回值
引用作为函数返回值类型的格式如下所示:
类型标识符 &函数名(形参列表 及类型说明){//函数体}
将引用作为返回值的优点是在内存中不产生被返回值的副本,从而大大提高了程序的安全性与效率。
返回值类型格式需要注意:
a、不能返回局部变量的引用。
b、不能返回函数内部new 分配的内存的引用。
c、可以返回类成员的引用,但最好是常引用类型。
d、流操作符《和》。
16、变量名为618Software是否合法
不合法,要一字母或者下划线开头。
17、C语言中,整型变量x 小于 0,是否可知x 乘以 2 也小于0
不一定。当x为整型值的最小值时不成立。
18、exit (status)是否跟从main()函数返回的status等价
在C语言标准中,它们是等价的。但是如果在退出的时候需要使用main()函数的局部数据,那么从main()函数中使用return()就不行了。exit()函数可以返回不同的数字。
19、已知String类定义,如何实现其函数体
C++知识,不咋会,没写上!可百度。
20、在C++中如何实现模板函数的外部调用
export 是C++新增的关键字,它的作用是实现模板函数的外部调用,类似于extern 关键字。
21、在C++中,关键字explicit 有什么作用
C++知识,不咋会,没写上!可百度。
22、C++ 中异常的处理方法以及使用哪些关键字
C++异常处理使用的关键字有try、catch、throw。
23、如何定义和实现一个类的成员函数为回调函数
C++知识,不咋会,没写上!可百度。