1.在C++程序中调用被C编译器编译后的函数,为什么要加extern"C"
答:extern是C/C++语言中表明函数和全局变量的作用范围的。其声明的函数和变量可以在模块中或其他模块中使用。
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。
假设某个C 函数的声明如下:
void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”,去找_foo.
2.Makefile文件的作用
答:makefile定义一系列规则来指定文件哪些需要先编译,哪些需要后编译,哪些需要重新编译。像shell脚本一样,可以执行操作系统的命令,最大的用处是“自动化编译”,只需make命令,整个工程完全自动编译。
3.阅读Makefile文件
all:libmys.so//终极目标(.so动态库链接,.a静态库链接)式规则用于说明 何时及如何重新生成目标,其列出了目标依赖的文件信 // 息,并通过调用命令来创建或更新目标
// targets : prerequisites
// recipe
// …
// targets为要生成或更新的目标,prerequisites为目标依赖的关系,recipe为生成目标的命令,一个规则可以有多条 // recipe
SRC = f1.c f2.c f3.c//当前文件下的所有.c文件
TGT = $(SRC:.c=.o)//$:去变量值,将SRC所有.c=>.o=>TGT
%.o : %.c //%表示静态模式下的自动化变量操作,“%”意思是匹配一个或者多个字符,例如,“%.h”表示所有以“.h”结尾的文件模式规则提供的一种扩展make隐式规则的方法,规则与普通规则一样,主要是目标必定含有%号,
cc -c $?//$? 规则中日期新于目标的所有相关文件的列表
libmys.so : $(TGT)
cc -shared -o $@ $(TGT)//-shared 表示生成动态库文件,$@ 规则的目标所对应的文件名,-o链接
clean://执行make clean清理生成的目标文件和动态库
rm -f $(TGT)
(1)此Makefile文件的主要功能是什么?
答:生成共享文件libmys.so
(2)此Makefile文件包含多少个规则?它们分别是什么?
答:4个规则(非命令),all,%.o:%.c,libmys.so,clean
(3)使用此Makefile文件可以生成目标文件f2.o吗?为什么?
答:可以。因为规则%.o,%.c,已经定义了*.o,*,c的关系与生成方法
4.简述static关键字作用(重点)
(1)设置变量的存储域:static变量的作用范围为该函数体,该变量内存只被分配一次,下次调用仍维持上值。
(2)限制局部变量的作用域:只能在本源文件中使用。,在模块内的static 变量可以在模块内函数所用,但不能被模块外其他函数访问。
(3)限制函数作用域:在模块内的static 函数可以在模块内函数所用,但不能被模块外其他函数访问。
(4)类中static成员变量:与所有实例共享。
(5)类中static成员函数:属于整个类所拥有,这个函数接收this指针,f()括号内无this,因而只能访问类的static成员变量
5.重载(overload)和重写(overied,铺盖)的区别
overload重载:是允许存在多个同名函数,而这些函数的参数表不同(个数,类型)
overied重写:是指子类重新定义父类虚函数的方法。
范围区别:重写和被重写函数,在不同类中;重载和被重载函数在同一类中
参数区别:重写和被重写函数参数列表一定相同,重载和被重载参数列表一定不同。
virtual:重写的基类必须有virtual修饰,重载可有可无。
6.sizeof与strlen的区别
关键字:sizeof:返回一个对象或类型所占字节数
函数:strlen:检测字符串实际长度。
7.C语言分配内存的方式有哪些?C语言中常见内存错误有哪些?
(1)静态存储区分配
(2)栈上分配
(3)堆上分配
错误:1.内存未分配成功;2.引用了尚未初始化的指针;3.越界;4.忘记释放内存;5.释放内存继续使用它
8.什么是野指针?如何避免野指针?
野指针:指向不确定地址的指针变量,即没有初始化;易出现段错误;
如何避免:a.指向空指针,b.使用malloc分配内存大小。
9.struct和class的区别
C:struct(数据类型:不能定义函数):默认public,不能修改,不可以继承,不能直接初始成员。
C++:class:默认private,可以继承,可以初始化,声明类模板。
10.什么是函数的可重入性
可重入函数是指一个可以被多个任务调用的过程,任务调用的过程,任务在调用时可不必担心数据是否会出错。不可重入:静态,malloc,I/O;
11.Makefile编写中为什么把.c变成.o
答:为了防止把所有.cpp文件变成.o,从而编译相应的.c文件,可以提高编译速度。
12.对象间是怎么实现数据共享
答:1.使用局部变量和全局变量共享数据 2.通过类的数据成员共享数据 3.通过类的静态成员 4.通过友元机制 5.指针成员变量与计数
13.C++中SendMessage和PostMessage有什么区别?
答:a.SendMessage是将指定信息发送到某个窗口。这个指定的信息调用窗口处理程序,直到窗口处理完这个程序才返回。
PostMessage 发送一个信息到线程信息队列,不等线程处理,并立即返回。
14.关键字volatile有什么含意?并给出三个不同的例子。
答:volatile是一个特征修饰符(type specifiervolatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。 例子1.并行设备的硬件寄存器2.一个中断服务程序中修改的供其他程序检测的变量。3.多线程应用中被几个任务共享的变量。
15.简述与new与malloc区别以及malloc实现原理,什么情况下NEW分配不到空间。
答:
申请内存所在位置空间 | 返回类型的安全性 | 失败结果不同 | 指定内存大小 | 调用 | |
new/delete | 自由存储区 | 安全 | 抛出bac_alloc异常 | 根据类型设计 | 构造 |
malloc/free | 堆上 | 强转 | NULL | 需显式指出所需内存大小 | 不会 |
malloc原理:当操作收到程序申请时,就会遍历链表,然后寻找第一个空间大于所申请空间的堆结点,然后将该结点从空间结点链表中删除,将该结点空间分配给程序。
什么情况:没有可用的连续内存段大于你要分配的空间。
16.请讲一讲析构函数和虚构函数的用法和作用
答:析构:对象离开生存空间时执行,用来清理分配空间,释放对象占用资源。它的名字和类名相同,没有返回值,没有参数,不能随意调用,也没有重载,只是在类对象生命周期接输时调用。
虚函数:用在继承中,当派生类需要重新定义基类的函数时需要基类中将函数声明为虚函数,作为使程序支持动态链接。
17.操作符重载的概念
答:通过重载可以扩展系统已有的功能,成员变量为公有,且没有定义构造,可以通过大括号来分割初始化成员。
操作符重载是C++的强大特性,本质通过函数扩展操作符,operator关键字是实现操作符的关键字,操作符遵循相同的函数重载原则。
18.C++里面是不是所有的动作都是main()引起的?
答:不是,首先初始化全局变量,当变量是一个对象,则会首先调用该对象的构造函数。
class A();
A a;
int main(){}
19.C++中函数模板与类模板有什么区别?
答:a.类模板没有自动类型推导
b.类模板在模板参数中可以有默认参数。
c.函数模板是一种抽象的函数定义,它代表一类同构函数,类模板是一种更高层的抽象的类定义