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函数了。