首页 > 代码库 > C/C++笔试题整理

C/C++笔试题整理

1. C的结构体和C++结构体的区别

(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。

(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。 

(3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。

 以上都是表面的区别,实际区别就是面向过程和面向对象编程思路的区别:

 

C的结构体只是把数据变量给包裹起来了,并不涉及算法。

而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。 

C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。

 

2. 如何在类中定义常量成员并为其初始化?解答:只能在初始化列表里对const成员初始化,像下面这样:

class CBook {public:    const double m_price;    CBook() :m_price(8.8) { }};

 

3. 在定义类的成员函数时使用mutable关键字的作用是什么?解答:当需要在const方法中修改对象的数据成员时,可以在数据成员前使用mutable关键字,防止出现编译出错。例子如下:

class CBook {public:  mutable double m_price;  // 如果不加就会出错  CBook(double price) :m_price(price) { }  double getPrice() const; // 定义const方法};double CBook::getPrice() const {  m_price = 9.8;  return m_price;}

4. C++中的explicit关键字有何作用?

禁止将构造函数作为转换函数,即禁止构造函数自动进行隐式类型转换。 例如CBook中只有一个参数m_price,在构建对象时可以使用CBook c = 9.8这样的隐式转换,使用explicit防止这种转换发生。

 

5. 构造函数调用类的另一个构造函数问题:

  在C++中,如果确定了某一个构造函数的创建过程,在该构造函数中如果调用了其它重载的构造函数

  它初始化的并不是指定的这个this了。

  例子说明如下:

class CBook {public:  double m_price;  CBook() {    CBook(8.8);  }  CBook(double price) : m_price(price) { }};int main() {  CBook c;  cout << c.m_price << endl;  // 此时并不会输出理想中的8.8}

 

6. 虚函数原理考点,例如下面程序的输出是什么?

class A {public:  virtual void funa();  virtual void funb();  void func();  static void fund();  static int si;private:  int i;  char c;};

问:sizeof(A) = ?

解答:

关于类占用的内存空间,有以下几点需要注意: 

(1)如果类中含有虚函数,则编译器需要为类构建虚函数表,类中需要存储一个指针指向这个虚函数表的首地址,注意不管有几个虚函数,都只建立一张表,所有的虚函数地址都存在这张表里,类中只需要一个指针指向虚函数表首地址即可。 

(2)类中的静态成员是被类所有实例所共享的,它不计入sizeof计算的空间 

(3)类中的普通函数或静态普通函数都存储在栈中,不计入sizeof计算的空间 

(4)类成员采用字节对齐的方式分配空间

答案:12(32位系统)或16(64位系统)

 

7. 虚继承的作用是什么?

在多继承中,子类可能同时拥有多个父类,如果这些父类还有相同的父类(祖先类),那么在子类中就会有多份祖先类。例如,类B和类C都继承与类A,如果类D派生于B和C,那么类D中就会有两份A。为了防止在多继承中子类存在重复的父类情况,可以在父类继承时使用虚函数,即在类B和类C继承类A时使用virtual关键字,例如: 

class B : virtual public A 

class C : virtual public A 

注:因为多继承会带来很多复杂问题,因此要慎用。

C/C++笔试题整理