C++面试题集结(资料来自网上)

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释放这些内存。动态内存的生成期由程序员决定,使用灵活,但是问题也最多。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值