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位系统)或24(64位系统)

 

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

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

class B : virtual public A 

class C : virtual public A 

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

 

8. 守护函数的编写过程:

  • 创建子进程,关闭父进程;
  • 设置文件权限掩码。当进程创建新文件(使用open(const char *pathname, int flags, mode_t mode)系统调用时,文件的权限将是mode&0777;
  • 创建新会话,设置本进程为进程组的首领;
  • 切换工作目录;
  • 关闭标准输入设备、标准输出设备和标准错误输出设备;
  • 关闭其他已经打开的文件描述符;
  • 将标准输入、标准输出、标准错误重定向到/dev/null文件

 

9. 一个基类声明了一个virtual函数,在子类当中将这个virtual函数改成私有,之后用一个指向子类的父类指针去调用这个函数,会有什么情况,为什么?

  正常执行之类的私有函数成员,不会因为是私有成员函数就发生调用错误。原因:通过父类的公有(public)成员函数接口调用,虚函数的调用其实就是找到虚函数表的相应指针。

 

10. 在main函数代码执行前打印一个字符串,C++该如何做,C该如何做?

  C++:定义一个类A,在类的构造函数中打印这么一个字符串,然后声明类A的一个对象为全局变量。

  C:???不知道啊,求救!

posted @ 2014-11-29 12:18  wiessharling  阅读(776)  评论(2编辑  收藏  举报