C++笔试题

1、C++的类和C里面的struct有什么区别?
   答:struct和class的区别在于C里面的struct没有定义方法,而C++的类是将不同类型的数据和与这些数据相关的操作封装在一起的集合体,包含了操作方法。

2、请说出const与#define相比,有何优点?
   答:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
    有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

3、类成员函数的重载、覆盖和隐藏区别?
   答:成员函数被重载的特征:相同的范围(在同一个类中);函数名字相同;参数不同;virtual关键字可有可无。
   覆盖是指派生类函数覆盖基类函数,其特征是:函数名字相同;参数相同;范围不同(分别位于派生类与基类中);基类函数必须有 virtual 关键字。
   “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

4、堆和栈的区别?
   答:栈是由编译器自动分配释放,用来存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
   堆一般是由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。

5、面向对象的三个基本特征,并简单叙述之?
   答:封装:将客观事物抽象成类,每个类对自身的数据和方法实行访问权限保护(private,protected,public)。
   继承:广义的继承有三种实现形式:实现继承、可视继承、接口继承。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
   多态:是将父类对象设置成为和一个或多个他的子类对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给其父类类型的指针。

6、构造函数可否是虚函数,为什么?析构函数呢,可否是纯虚的呢?
   答:构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。析构函数可以为纯虚函数。

7、C++是不是类型安全的?
   答:C++不是类型安全的。因为两个不同类型的指针之间可以强制转换(用reinterpret cast)。

8、多态的作用?
   答:多态的作用包括:隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用。接口重用:为了在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

9、请找出下面代码中的错误。
void test (){
  char string[10];
  char* str1 = "0123456789";
  strcpy( string, str1 );
}

   答:字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界。

10、请找出下面代码中的错误。
void test(char* str1){
  char string[10];
  if( strlen( str1 ) <= 10 ){
    strcpy( string, str1 );
  }
}

   答:if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。

11、参数传递具体有哪几种方式?
   答:参数传递具体包括:值传递,指针传递和引用传递三种方式。

12、重载和重写的区别?
   答:首先从定义上来说:
   重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
   重写:是指子类重新定义复类虚函数的方法。
   其次从实现原理上来说:
   重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译期间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关。
    重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

13、虚函数的本质和实现机制?
   答:虚函数的本质就是通过基类访问派生类定义的函数。虚函数只能借助于指针或者引用来达到多态的效果。

你可能感兴趣的:(C++)