C/C++面试一

1、C++和C#除了语法上的差别以外,有什么不同的地方?

---- 1)C#有垃圾自动回收机制,程序员不用担心对象的回收。

---- 2)C#严禁使用指针,只能处理对象。如果希望使用指针,则仅可在unsafe程序块中能使用指针。

---- 3)C#只能单继承

---- 4)C#必须通过类名访问静态成员。不能像C++中那样,通过对象访问静态成员。

---- 5)在子类中覆盖父类的虚函数时必须用关键字override,覆盖父类的方法要用关键字new。

2、C++是不是类型安全的? ---- 不是,两个不同类型的指针之间可以强制转换。

3、main函数执行以前,还会执行什么代码?

---- 全局对象的构造函数会在main函数之前执行。

4、有4个同样的容器,里面装满了粒数相同的药丸,正常药丸的质量为m,变质药丸的质量为m+1,现在已知这四个容器中,有一个装的全部是

变质药丸,用电子秤只称一次,找出那个容器装的是变质药丸?

---- 四个容器依次编号:1,2,3,4,从中分别取出1,2,3,4粒药丸,称这10粒药丸的重量,如果质量是10m+1,第一个容器中的是变质药丸。

如果是10m+2,第二个容器;10m+3,第三个;10m+4,第四个。

5、在8086汇编下,逻辑地址和物理地址是怎样转换的?

---- 通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器的地址,就得到了真正要访问的地址。

6、描述一下C++的多态?

---- C++的多态表现在两个部分,一个是静态连编下的函数重载,运算符重载;动态连编下的虚函数、纯虚函数。

7、const和#define相比优点?

---- const常量有数据类型,而宏常量没有数据类型。

---- 编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

---- 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

8、比较一下C++中static_cast 和 dynamic_cast 的区别?

---- dynamic_cast在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上,它被用于安全地沿着类的继承关系向下进行类型转换。

---- 如果你想在没有继承关系的类型中进行转换,可能想到static_cast。

9、类成员函数的重载、覆盖和隐藏区别?

---- 成员函数被重载的特征:

   1)相同的范围(在同一个类中)

   2)函数名字相同

   3)参数不同(个数不同或类型不同)

   4)Virtual关键字可有可无。

---- 覆盖是指派生类函数覆盖基类函数,特征是:

   1)不同的范围(分别位于派生类与基类)

   2)函数名字相同

   3)参数相同

   4)基类函数必须有virtual关键字。

---- 隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

   1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论是否有virtual关键字,基类的函数将被隐藏。

   2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏。

10、比较两个数的大小:((a+b) + abs(a-b)) / 2

11、打印源文件的文件名和当前行号:__FILE__,__LINE__.

12、main主函数执行完毕后,是否可能会再执行一段代码,给出说明?

---- 可以,可以用_onexit注册一个函数,它会在main之后执行.

知识了解:

  (1) 使用格式:_onexit(int fun()) ,其中函数fun()必须是带有int类型返回值的 无参数 函数;

  (2) _onexit() 包含在头文件cstdlib中,cstdlib为c语言中的库函数;

  (3) 无论函数_onexit() 放到main中任意位置,它都是最后执行。

#include <iostream>
#include <cstdlib>
using namespace std;
int f1(),f2(),f3(),f4();

void main()
{	
	_onexit(f1);
	_onexit(f2);
	_onexit(f3);
	_onexit(f4);
	printf("This is the first executed!\n");
}

int f1()
{
	printf("executed!\n");
	return 0;
}
int f2()
{
	printf("next ");
	return 0;
}
int f3()
{
	printf("is the ");
	return 0;
}
int f4()
{
	printf("This ");
	return 0;
}

选择start without debugging后,输出:

解析:当程序正常结束后,_onexit 函数会传递被调用函数的地址,按照后进先出的方式调用,传递的函数没有参数。

13、如何判断一段程序是由C编译程序还是由C++编译程序编译的?

#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif

 14、C++新增加有重载(overload),内联(inline),const,virtual四种机制。

---- 重载和内联:既可用于全局函数,也可用于类的成员函数。

---- const和virtual:只能用于类的成员函数。

内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。

const:被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

     1)参数做输入用的指针型参数,加上const可防止被意外改动。

     2)按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。

     3)给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。

          如函数:const char * GetString(void);   char * str = GetString()将会出错。而const char *str = GetString()是正确的。

     4)const 成员函数是指此函数体内只能调用const 成员变量,提高程序的健壮性。

virtual:虚函数,派生类可以覆盖掉的函数,纯虚函数:是个空函数,没有函数实现体。

15、 加上extern "c" 后,C++就直接可以调用c函数了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值