1.C++中struct和class的区别
a.成员的默认访问权限不同,struct成员默认是public权限,class成员默认是private权限。
b.默认继承权限不同。如果不明确指定继承方式,struct的默认继承方式是public,而class的默认继承方式是private。
2.如何判断一段程序是由c编译程序还是由c++编译程序编译的?
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
3.引用与指针的区别?
引用必须被初始化(作函数形参例外),指针不必。
引用初始化后不可以被改变,指针指向的对象可以被改变,指针本身的值也可以被改变。
不存在指向空值的引用,但存在指向空值的指针。
指针指向一个对象,保存了该对象的地址值,通过指针间接操作该对象。
引用是一个对象的别名,对引用的操作实际上就是对目标对象的操作。
4.int id[sizeof(unsigned long)]这样写是否正确?
正确,因为sizeof是编译时运算符,程序在编译阶段就知道了数组id的长度。可以看出是和机器有关的常量。
5.在某文件中定义的静态全局变量(或叫做静态外部变量),起作用域是定义该静态全局变量的文件,只能为该文件内的函数公用。
6.c++函数中值的传递的方式有:值传递,指针传递,引用传递三种。
7.对于一个频繁使用的短小函数,在c语言中应该用宏定义实现,在c++中应该用inline实现。inline是一种用于实现的关键字,而不是用于声明的关键字。
8.const与#define比较,const的优点有:
a.const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只做字符替换,没有类型检查,并且字符替换后可能会有意想不到的错误(边际效应)。
b.有些集成化的工具可以对const常量进行调试,但是不能对宏常量进行调试。
9.malloc/free与new/delete的区别
malloc和free是c/c++的标准库函数。new和delete是c++的运算符。它们都可以用于申请动态内存和释放内存。
对于非内部数据类型的对象而已,只用malloc和free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,在消亡的之前要自动执行析构函数。由于malloc和free是库函数,不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc和free。因此c++需要一个能够完成动态内存分配和初始化工作的的运算符new,以及一个能够完成清理工作和内存释放的运算符delete。
10.如果是申请动态内存的时候,找不到足够大的内存块,malloc和new返回NULL指针,宣告申请内存失败,如何处理内存耗尽问题?
a.判断指针是否为NULL,如果是则马上return终止本函数的执行。
b.判断指针是否为NULL,如果是则马上调用exit(1)终止整个程序的运行。
c.为malloc和new设置异常处理函数。
11.c++是否是类型安全的?
不是,两个不同类型的指针之间可以强制转换(用reinterpret cast)。
12.如何判断当前系统是16位还是32位?
定义一个指针p,如果sizeof(p)的值为2,则是16位系统,如果其值为4,则是32位系统。
13.如何判断当前系统是16位还是32位?(不用sizeof函数)。
int a = ~0;
if(a > 65536)
{
cout<<"32bit";
}else
{
cout<<"16bit";
}
14.void * ( * (*fp1) (int) ) [10]; //fp1是一个指针,指向一个函数,该函数有一个int类型参数,该函数的返回值是一个指针,该返回指针指向一个长度10的数组,数组的元素是void*类型的。
float (*(*fp2)(int,int,int))(int);//fp2是一个指针,指向一个有三个int形参的函数,该函数返回一个指针,该指针指向一个有一个int形参的函数,该函数返回值是float型。
15.多态类中的虚函数表是compile-time,还是run-time时建立的?
虚函数表是在编译期就建立的,各个虚函数这时被组织成了一个虚函数的入口地址的数组,而对象的隐藏成员--虚函数表指针是在运行期--也就是构造函数被调用的时候进行初始化的,这是实现多态的关键。
16.内存分配方式有几种?
a.从静态存储区分配。内存在编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在,例如全局变量 。
b.在栈上创建。函数的局部变量就是在栈上自动分配的内存,函数执行完,这些存储单元会自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
c.从堆上分配,也称为动态内存分配,在程序运行的时候用malloc和new申请的任意多的动态内存,程序员自己负责何时调用free和delete释放这些内存。动态内存的生成期由程序员决定,使用灵活,但是问题也最多。